一、请描述一次完整的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 [[email protected] opt]# tar xzvf apr-1.5.2.tar.gz && cd apr-1.5.2 [[email protected] apr-1.5.2]# ./configure --prefix=/usr/local/apr [[email protected] apr-1.5.2]# make && make install #编译安装apr-util-1.5.4.tar.gz [[email protected] opt]# tar xzvf apr-util-1.5.4.tar.gz && cd apr-util-1.5.4 [[email protected] apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/ [[email protected] apr-util-1.5.4]# make && make install #编译安装pcre-8.38.tar.gz [[email protected] opt]# tar xzvf pcre-8.38.tar.gz && cd pcre-8.38 [[email protected] pcre-8.38]# ./configure --prefix=/usr/local/pcre [[email protected] pcre-8.38]# make && make install #创建系统组和用户 [[email protected] httpd-2.4.17]# groupadd -r apache [[email protected] httpd-2.4.17]# useradd -r -g apache aapache [[email protected] opt]# tar xzvf httpd-2.4.17.tar.gz && cd httpd-2.4.17 [[email protected] 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为安装常用模块(安装不代表启用) [[email protected] httpd-2.4.17]# make && make install
2、编译安装mysql
[[email protected] opt]# groupadd mysql #添加mysql组 [[email protected] opt]# useradd -r -g mysql mysql #添加mysql用户 [[email protected] opt]# tar xzvf mysql-5.6.24.tar.gz [[email protected] opt]# yum -y install make gcc-c++ cmake bison-devel ncurses-devel libaio #安装编译代码所需要的包 [[email protected] opt]# cd /opt/mysql-5.6.24 [[email protected] 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
[email protected] opt]# tar xzvf php-5.6.5.tar.gz [[email protected] 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 [[email protected] php-5.6.5]# make && make install [[email protected] etc]# cp /opt/php-5.6.5/php.ini-development /usr/local/php/etc/php.ini [[email protected] etc]# cd /usr/local/php/etc/ [[email protected] etc]# cp php-fpm.conf.default php-fpm.conf [[email protected] 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 [[email protected] 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 [[email protected] opt]# tar xzvf apr-1.5.2.tar.gz && cd apr-1.5.2 [[email protected] apr-1.5.2]# ./configure --prefix=/usr/local/apr [[email protected] apr-1.5.2]# make && make install #编译安装apr-util-1.5.4.tar.gz [[email protected] opt]# tar xzvf apr-util-1.5.4.tar.gz && cd apr-util-1.5.4 [[email protected] apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/ [[email protected] apr-util-1.5.4]# make && make install #编译安装pcre-8.38.tar.gz [[email protected] opt]# tar xzvf pcre-8.38.tar.gz && cd pcre-8.38 [[email protected] pcre-8.38]# ./configure --prefix=/usr/local/pcre [[email protected] pcre-8.38]# make && make install
2、编译安装httpd-2.4.17
#创建系统组和用户 [[email protected] httpd-2.4.17]# groupadd -r apache [[email protected] httpd-2.4.17]# useradd -r -g apache aapache [[email protected] opt]# tar xzvf httpd-2.4.17.tar.gz && cd httpd-2.4.17 [[email protected] 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为安装常用模块(安装不代表启用) [[email protected] httpd-2.4.17]# make && make install
3、配置虚拟主机
[[email protected] ~]# vim /etc/httpd/httpd.conf # Virtual hosts Include /etc/httpd/conf.d/*.conf [[email protected] 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> [[email protected] httpd]# echo www1.stuX.com > /vhosts/www1.stuX.com/index.html #生成主页文件 [[email protected] httpd]# echo www2.stuX.com > /vhosts/www2.stuX.com/index.html [[email protected] conf.d]# cp /etc/httpd/extra/httpd-info.conf ../conf.d/ [[email protected] 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> [[email protected] conf.d]# htpasswd -c -m /etc/httpd/conf.d/.htpasswd status #创建用户认证的数据库文件
访问结果
基于用户名的用户访问控制
apache状态页面
五、为第4题中的第2个虚拟主机提供https服务,使得用户可以通过https安全的访问此web站点;
(1)要求使用证书认证,证书中要求使用的国家(CN)、州(HA)、城市(ZZ)和组织(MageEdu);
(2)设置部门为Ops,主机名为www2.stuX.com,邮件为[email protected];
1、生成一个自签署证书
[[email protected] 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 []:[email protected]
2、需要使用证书的主机上生成CA请求.
[[email protected] 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 []:[email protected] Please enter the following ‘extra‘ attributes to be sent with your certificate request A challenge password []: An optional company name []: [[email protected] ssl]# scp httpd.csr [email protected]:/tmp #将请求文件传输给CA所在主机
3、CA签署证书
[[email protected] 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 = [email protected] 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 [[email protected] CA]# scp certs/www2.stuX.com.crt 10.18.11.30:/etc/httpd/ssl/ #将证书文件传到httpd服务中
4、添加httpd中ssl配置
[[email protected] 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模块
[[email protected] opt]# tar xzvf php-5.6.5.tar.gz [[email protected] 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 [[email protected] php-5.6.5]# make && make install [[email protected] etc]# cp /opt/php-5.6.5/php.ini-development /usr/local/php/etc/php.ini [[email protected] etc]# cd /usr/local/php/etc/ [[email protected] etc]# cp php-fpm.conf.default php-fpm.conf [[email protected] 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 [[email protected] etc]# /usr/local/php/sbin/php-fpm #启动php [[email protected] etc]# vim /usr/local/apache/htdocs/index.php #编辑测试页面 <? phpinfo(); ?>
2、php编译成fpm模式
[[email protected] 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 [[email protected] php-5.6.5]# make && make install [[email protected] php-5.6.5]# cp php.ini-production /etc/php.ini #拷贝配置文件至/etc目录 [[email protected] php-5.6.5]# cp /usr/local/php5/etc/php-fpm.conf.default /usr/local/php5/etc/php-fpm.conf [[email protected] php-5.6.5]# vim /usr/local/php5/etc/php-fpm.conf pid = /usr/local/php5/var/run/php-fpm.pid #取消pid选项的注释 [[email protected] fpm]# cp init.d.php-fpm /etc/rc.d/init.d/php-fp #添加服务脚本 [[email protected] fpm]# chmod +x /etc/rc.d/init.d/php-fpm [[email protected] fpm]# chkconfig –add php-fpm [[email protected] fpm]# service php-fpm start #启动php-fpm [[email protected] ~]# 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