一、请描述一次完整的http请求处理过程;

HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:

1. 建立TCP连接

在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能进行更高层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。

2. Web浏览器向Web服务器发送请求命令

一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令。例如:GET/sample/hello.jsp HTTP/1.1。

3. Web浏览器发送请求头信息

浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。

4. Web服务器应答

客户机向服务器发出请求后,服务器会客户机回送应答, HTTP/1.1 200 OK ,应答的第一部分是协议的版本号和应答状态码。

5. Web服务器发送应答头信息

正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。

6. Web服务器向浏览器发送数据

Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。

7. Web服务器关闭TCP连接

一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码:Connection:keep-alive
TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

二、httpd所支持的处理模型有哪些,他们的分别使用于哪些环境。

    Apache有两种工作模型,一种是基于进程的preforker模型,一种是基于线程和进程混合的Worker模型 
prefork模式

prefork模式可以算是很古老但是非常稳定的Apache模式。Apache在启动之初,就预先fork一些子进程,然后等待请求进来。之所以这样做,是为了减少频繁创建和销毁进程的开销。每个子进程只有一个线程,在一个时间点内,只能处理一个请求。
优点:成熟稳定,兼容所有新老模块。同时,不需要担心线程安全的问题。(我们常用的mod_php,PHP的拓展不需要支持线程安全)
缺点:一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求,在这种场景下,它会将请求放进队列中,一直等到有可用进程,请求才会被处理。

worker模式

worker模式比起上一个,是使用了多进程和多线程的混合模式。它也预先fork了几个子进程(数量比较少),然后每个子进程创建一些线程,同时包括一个监听线程。每个请求过来,会被分配到1个线程来服务。线程比起进程会更轻量,因为线程通常会共享父进程的内存空间,因此,内存的占用会减少一些。在高并发的场景下,因为比起prefork有更多的可用线程,表现会更优秀一些。
有些人会觉得奇怪,那么这里为什么不完全使用多线程呢,还要引入多进程?
原因主要是需要考虑稳定性,如果一个线程异常挂了,会导致父进程连同其他正常的子线程都挂了(它们都是同一个进程下的)。为了防止这场异常场景出现,就不能全部使用线程,使用多个进程再加多线程,如果某个线程出现异常,受影响的只是Apache的一部分服务,而不是整个服务。
优点:占据更少的内存,高并发下表现更优秀。
缺点:必须考虑线程安全的问题,因为多个子线程是共享父进程的内存地址的。如果使用keep-alive的长连接方式,某个线程会一直被占据,也许中间几乎没有请求,需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。

EVENT模式

这个是Apache中最新的模式,在现在版本里的已经是稳定可用的模式。它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)。event
MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力。

三、源码编译安装LAMP环境(基于wordpress程序),并写出详细的安装、配置、测试过程。 

1、编译安装httpd-2.4.17

#编译安装apr-1.5.2.tar.gz
[root@localhost opt]# tar xzvf apr-1.5.2.tar.gz && cd apr-1.5.2
[root@localhost apr-1.5.2]# ./configure --prefix=/usr/local/apr
[root@localhost apr-1.5.2]# make && make install

#编译安装apr-util-1.5.4.tar.gz
[root@localhost opt]# tar xzvf apr-util-1.5.4.tar.gz && cd apr-util-1.5.4
[root@localhost apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/
[root@localhost apr-util-1.5.4]# make && make install

#编译安装pcre-8.38.tar.gz
[root@localhost opt]# tar xzvf pcre-8.38.tar.gz && cd pcre-8.38
[root@localhost pcre-8.38]# ./configure --prefix=/usr/local/pcre
[root@localhost pcre-8.38]# make && make install

#创建系统组和用户
[root@localhost httpd-2.4.17]# groupadd -r apache
[root@localhost httpd-2.4.17]# useradd -r -g apache aapache
[root@localhost opt]# tar xzvf httpd-2.4.17.tar.gz && cd httpd-2.4.17
[root@localhost httpd-2.4.17]# ./configure --prefix=/usr/local/apache \
> --sysconfdir=/etc/httpd \    # 指定配置文件路径
> --enable-so \    # 支持动态加载DSO模块
> --enable-ssl \    # 开启SSL功能,支持https
> --enable-cgi \    # 启用与外部应用程序的cgi接口功能
> --enable-rewrite \    # 支持url重写
> --with-zlib \    # 支持web页面压缩传送
> --with-pcre=/usr/local/pcre \    # 增强型的正则表达式分析工具,nginx等程序依赖,依赖于pcre-devel开发包
> --with-apr=/usr/local/apr \    # 指定高版本apr程序路径,不指定则会自动指定系统默认版本
> --with-apr-util=/usr/local/apr-util \    # 指定apr-util路径
> --enable-mpms-shared=all \    # 支持动态装卸载所有mpm
> --with-mpm=prefork \    # mpm默认使用prefork
> --enable-modules=all    # all为安装所有模块,most为安装常用模块(安装不代表启用)
[root@localhost httpd-2.4.17]# make && make install

2、编译安装mysql

[root@localhost opt]# groupadd mysql        #添加mysql组
[root@localhost opt]# useradd -r -g mysql mysql        #添加mysql用户
[root@localhost opt]# tar xzvf mysql-5.6.24.tar.gz 
[root@localhost opt]# yum -y install make gcc-c++ cmake bison-devel ncurses-devel libaio        #安装编译代码所需要的包
[root@localhost opt]# cd /opt/mysql-5.6.24
[root@localhost mysql-5.6.24]#  cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql  \              [MySQL安装的根目录]
-DMYSQL_DATADIR=/mydata/mysql/data  \                   [MySQL数据库文件存放目录]
-DSYSCONFDIR=/etc \                                     [MySQL配置文件所在目录]
-DMYSQL_USER=mysql \                                    [MySQL用户名]      
-DWITH_MYISAM_STORAGE_ENGINE=1 \                        [MySQL的数据库引擎]
-DWITH_INNOBASE_STORAGE_ENGINE=1 \                      [MySQL的数据库引擎]
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \                       [MySQL的数据库引擎]
-DWITH_MEMORY_STORAGE_ENGINE=1 \                        [MySQL的数据库引擎]
-DWITH_READLINE=1 \                                     [MySQL的readline library]
-DMYSQL_UNIX_ADDR=/var/run/mysql/mysql.sock \           [MySQL的通讯目录]
-DMYSQL_TCP

3、编译安装php

root@localhost opt]# tar xzvf php-5.6.5.tar.gz 
[root@localhost php-5.6.5]# ./configure --enable-opcache --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring=all --with-pdo-mysql --enable-sockets --enable-mbstring --enable-fpm --with-curl --with-iconv-dir=/usr/local --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --enable-xml --with-gd  --with-libxml-dir=/usr --enable-xml --with-openssl --with-iconv
[root@localhost php-5.6.5]# make && make install
[root@localhost etc]# cp /opt/php-5.6.5/php.ini-development /usr/local/php/etc/php.ini
[root@localhost etc]# cd /usr/local/php/etc/
[root@localhost etc]# cp php-fpm.conf.default php-fpm.conf   
[root@localhost etc]# vim /etc/httpd/httpd.conf    #编辑配置文件,添加下面三行使httpd支持php
DirectoryIndex index.php index.html
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps     
[root@localhost etc]# /usr/local/php/sbin/php-fpm        #启动php



四、建立httpd服务器(基于编译的方式进行),要求:

提供两个基于名称的虚拟主机:

(a)www1.stuX.com,页面文件目录为/web/vhosts/www1;错误日志为/var/log/httpd/www1.err,访问日志为/var/log/httpd/www1.access;

(b)www2.stuX.com,页面文件目录为/web/vhosts/www2;错误日志为/var/log/httpd/www2.err,访问日志为/var/log/httpd/www2.access;

(c)为两个虚拟主机建立各自的主页文件index.html,内容分别为其对应的主机名;

(d)通过www1.stuX.com/server-status输出httpd工作状态相关信息,且只允许提供帐号密码才能访问(status:status);

1、编译安装依赖包

#编译安装apr-1.5.2.tar.gz
[root@localhost opt]# tar xzvf apr-1.5.2.tar.gz && cd apr-1.5.2
[root@localhost apr-1.5.2]# ./configure --prefix=/usr/local/apr
[root@localhost apr-1.5.2]# make && make install

#编译安装apr-util-1.5.4.tar.gz
[root@localhost opt]# tar xzvf apr-util-1.5.4.tar.gz && cd apr-util-1.5.4
[root@localhost apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/
[root@localhost apr-util-1.5.4]# make && make install

#编译安装pcre-8.38.tar.gz
[root@localhost opt]# tar xzvf pcre-8.38.tar.gz && cd pcre-8.38
[root@localhost pcre-8.38]# ./configure --prefix=/usr/local/pcre
[root@localhost pcre-8.38]# make && make install

2、编译安装httpd-2.4.17

#创建系统组和用户
[root@localhost httpd-2.4.17]# groupadd -r apache
[root@localhost httpd-2.4.17]# useradd -r -g apache aapache
[root@localhost opt]# tar xzvf httpd-2.4.17.tar.gz && cd httpd-2.4.17
[root@localhost httpd-2.4.17]# ./configure --prefix=/usr/local/apache \
> --sysconfdir=/etc/httpd \    # 指定配置文件路径
> --enable-so \    # 支持动态加载DSO模块
> --enable-ssl \    # 开启SSL功能,支持https
> --enable-cgi \    # 启用与外部应用程序的cgi接口功能
> --enable-rewrite \    # 支持url重写
> --with-zlib \    # 支持web页面压缩传送
> --with-pcre=/usr/local/pcre \    # 增强型的正则表达式分析工具,nginx等程序依赖,依赖于pcre-devel开发包
> --with-apr=/usr/local/apr \    # 指定高版本apr程序路径,不指定则会自动指定系统默认版本
> --with-apr-util=/usr/local/apr-util \    # 指定apr-util路径
> --enable-mpms-shared=all \    # 支持动态装卸载所有mpm
> --with-mpm=prefork \    # mpm默认使用prefork
> --enable-modules=all    # all为安装所有模块,most为安装常用模块(安装不代表启用)
[root@localhost httpd-2.4.17]# make && make install

3、配置虚拟主机

[root@localhost ~]# vim /etc/httpd/httpd.conf    
# Virtual hosts
Include /etc/httpd/conf.d/*.conf          
[root@localhost extra]# vim /etc/httpd/conf.d/stuX.com.conf        #配置www1.stuX.com
<VirtualHost 10.18.11.30:80>        #虚拟主机监听地址
  ServerName www1.stuX.com        #虚拟主机域名
  DocumentRoot /vhosts/www1.stuX.com        #网站根目录
  CustomLog /var/log/httpd/www1.access combined    #配置访问日志路径
  ErrorLog "/var/log/httpd/www1.err"        #配置错误日志路径
  <Directory "/vhosts/www1.stuX.com">        #允许所有访问请求/vhosts/www1.stuX.com
      <RequireAll>    
        Require all granted
    </RequireAll>
  </Directory>
</VirtualHost>
<VirtualHost 10.18.11.30:80>        #配置www2.stuX.com
  ServerName www2.stuX.com    
  DocumentRoot /vhosts/www2.stuX.com
  CustomLog /var/log/httpd/www2.access combined
  ErrorLog "/var/log/httpd/www2.err"
  <Directory "/vhosts/www2.stuX.com">
      <RequireAll>
        Require all granted
    </RequireAll>
  </Directory>
</VirtualHost>
[root@localhost httpd]# echo www1.stuX.com > /vhosts/www1.stuX.com/index.html        #生成主页文件
[root@localhost httpd]# echo www2.stuX.com > /vhosts/www2.stuX.com/index.html
[root@localhost conf.d]# cp /etc/httpd/extra/httpd-info.conf ../conf.d/
[root@localhost conf.d]# vim /etc/httpd/conf.d/httpd-info.conf    #修改其中server-status配置
<Location /server-status>
    SetHandler server-status
    Authtype   Basic        #设置认证类型
    Authname   "status"    #定义受保护的领域名称,在浏览器访问的时候会显示
    AuthUserFile /etc/httpd/conf.d/.htpasswd        #要求只有认证文件中的合法用户才能访问
    Require valid-user        #valid-user表示所有合法用户,若只授权给单个用户,则改为指定的用户名
</Location>
[root@localhost conf.d]# htpasswd -c -m /etc/httpd/conf.d/.htpasswd status    #创建用户认证的数据库文件

访问结果

第九周作业【Linux微职位】_其他
基于用户名的用户访问控制

第九周作业【Linux微职位】_其他_02


apache状态页面

第九周作业【Linux微职位】_其他_03


五、为第4题中的第2个虚拟主机提供https服务,使得用户可以通过https安全的访问此web站点;

(1)要求使用证书认证,证书中要求使用的国家(CN)、州(HA)、城市(ZZ)和组织(MageEdu);

(2)设置部门为Ops,主机名为www2.stuX.com,邮件为admin@stuX.com;

1、生成一个自签署证书

[root@localhost CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650        #生成一个自签署证书    
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HA
Locality Name (eg, city) [Default City]:ZZ
Organization Name (eg, company) [Default Company Ltd]:MageEdu
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:www2.stuX.com
Email Address []:admin@stuX.co

2、需要使用证书的主机上生成CA请求.

[root@localhost ssl]# openssl  req -new -key httpd.key -out httpd.csr        #生成签署证书请求
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HA
Locality Name (eg, city) [Default City]:ZZ
Organization Name (eg, company) [Default Company Ltd]:MageEdu
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:www2.stuX.com
Email Address []:admin@stuX.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@localhost ssl]# scp httpd.csr root@10.18.11.29:/tmp        #将请求文件传输给CA所在主机

3、CA签署证书

[root@localhost CA]# openssl ca -in /tmp/httpd.csr -out certs/www2.stuX.com.crt -days 3650
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 2 (0x2)
        Validity
            Not Before: Oct 21 14:10:05 2016 GMT
            Not After : Oct 19 14:10:05 2026 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = HA
            organizationName          = MageEdu
            organizationalUnitName    = Ops
            commonName                = www2.stuX.com
            emailAddress              = admin@stuX.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                16:5A:7B:84:A7:5F:7D:EA:CC:0D:1D:CB:5F:D3:A0:AD:29:20:98:63
            X509v3 Authority Key Identifier: 
                keyid:C7:83:51:96:AC:82:AF:DA:35:58:02:CD:B3:75:B2:37:B8:5D:59:38

Certificate is to be certified until Oct 19 14:10:05 2026 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
[root@localhost CA]# scp certs/www2.stuX.com.crt 10.18.11.30:/etc/httpd/ssl/        #将证书文件传到httpd服务中

4、添加httpd中ssl配置

[root@localhost conf.d]# vim /etc/httpd/conf.d/httpd_ssl.conf         #编辑ssl配置文件
LoadModule ssl_module modules/mod_ssl.so        #添加需要加载的模块
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
ServerName www2.stuX.com
DocumentRoot "/vhosts/www2.stuX.com"
<Directory "/vhosts/www2.stuX.com">
    <RequireAll>
        Require all granted
    </RequireAll>
</Directory>
SSLCertificateFile "/etc/httpd/ssl/www2.stuX.com.crt"        #定义证书文件路径
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key        #定义证书文件私钥

六、在LAMP架构中,请分别以php编译成httpd模块形式和php以fpm工作为独立守护进程的方式来支持httpd,列出详细的过程。

1、编译安装php模块


[root@localhost opt]# tar xzvf php-5.6.5.tar.gz 
[root@localhost php-5.6.5]# ./configure --enable-opcache --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring=all --with-pdo-mysql --enable-sockets --enable-mbstring --enable-fpm --with-curl --with-iconv-dir=/usr/local --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --enable-xml --with-gd  --with-libxml-dir=/usr --enable-xml --with-openssl --with-iconv
[root@localhost php-5.6.5]# make && make install
[root@localhost etc]# cp /opt/php-5.6.5/php.ini-development /usr/local/php/etc/php.ini
[root@localhost etc]# cd /usr/local/php/etc/
[root@localhost etc]# cp php-fpm.conf.default php-fpm.conf   
[root@localhost etc]# vim /etc/httpd/httpd.conf    #编辑配置文件,添加下面三行使httpd支持php
DirectoryIndex index.php index.html
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps     
[root@localhost etc]# /usr/local/php/sbin/php-fpm        #启动php
[root@localhost etc]# vim /usr/local/apache/htdocs/index.php    #编辑测试页面
<?
         phpinfo();
?>


2、php编译成fpm模式

[root@localhost php-5.6.5]#./configure –prefix=/usr/local/php5 –with-mysql=mysqlnd –with-openssl
 –with-mysqli=mysqlnd –enable-mbstring –with-freetype-dir –with-jpeg-dir
 –with-png-dir –with-zlib –with-libxml-dir=/usr –enable-xml  
–enable-sockets –enable-fpm –with-mcrypt  –with-config-file-path=/etc 
–with-config-file-scan-dir=/etc/php.d –with-bz2
[root@localhost php-5.6.5]# make && make install
[root@localhost php-5.6.5]# cp php.ini-production /etc/php.ini    #拷贝配置文件至/etc目录
[root@localhost php-5.6.5]# cp /usr/local/php5/etc/php-fpm.conf.default  /usr/local/php5/etc/php-fpm.conf
[root@localhost php-5.6.5]# vim /usr/local/php5/etc/php-fpm.conf
pid = /usr/local/php5/var/run/php-fpm.pid    #取消pid选项的注释
[root@localhost fpm]# cp init.d.php-fpm /etc/rc.d/init.d/php-fp    #添加服务脚本
[root@localhost fpm]# chmod +x /etc/rc.d/init.d/php-fpm
[root@localhost fpm]# chkconfig –add php-fpm
[root@localhost fpm]# service php-fpm start    #启动php-fpm
[root@localhost ~]# vim /etc/httpd/httpd.conf    
LoadModule proxy_module modules/mod_proxy.so        #启用这两个模块
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
AddType application/x-httpd-php .php            #添加文件类型
AddType application/x-httpd-php-source .phps
ProxyRequests Off                        #添加php文件的访问通过fpm
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/usr/local/apache24/htdocs/$1