1、请描述一次完整的http请求处理过程;
1. 建立或处理连接:接收请求或拒绝请求;
2. 接收请求:接收来自于网络上的主机请求报文中对某特定资源的一次请求的过程;
3. 处理请求:对请求报文进行解析,获取客户端请求的资源及请求方法等相关信息;
4. 访问资源:获取请求报文中请求的资源;
5. 构建响应报文:
6. 发送响应报文:
7. 记录日志:
2、httpd所支持的处理模型有哪些,他们的分别使用于哪些环境。
prefork:多进程模型,每个进程响应一个请求
一个主进程:负责生成子进程及回收子进程,负责创建套接字,负责接收请求,并将其派发给某子进程进行处理;
n个子进程:每个子进程处理一个请求
工作模型:会预先生成几个空闲进程,随时等待用于响应用户请求,最大空闲和最小空闲;
缺点:一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求,在这种场景下,
它会将请求放进队列中,一直等到有可用进程,请求才会被处理。
worker:多进程多线程模型,每线程处理一个用户请求;
一个主进程:负责生成子进程,负责创建套接字,负责接收请求,并将其派发给某子进程进行处理;
多个子进程:每个子进程负责生产多个线程
每个线程:负责响应用户请求;
并发响应数量:m*n
m:子进程数量
n:每个子进程所能创建的最大线程数量
优点:占据更少的内存,高并发下表现更优秀。
缺点:必须考虑线程安全的问题,因为多个子线程是共享父进程的内存地址的。如果使用keep-alive的长连接方式,某个
线程会一直被占据,也许中间几乎没有请求,需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致
在高并发场景下的无服务线程可用。(该问题在prefork模式下,同样会发生)
event:事件驱动模型,多进程模型,每个进程响应多个请求;
一个主进程:负责生成子进程,负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
子进程:基于事件驱动机制直接响应多个请求:
httpd2.2版本:仍为测试使用模型
httpd2.4版本:event可生产环境中使用
它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题
3、源码编译安装LAMP环境(基于wordpress程序),并写出详细的安装、配置、测试过程。
httpd-2.4.23 + mysql-5.5.52-linux2.6-x86_64 + php-5.5.38编译安装过程:
一、编译安装apache
yum groupinstall "Development Tools" "Server platform Development"
yum install mode_ssl openssl-devel pcre-devel
1、解决依赖关系
(1) 编译安装apr
# tar xf apr-1.5.2.tar.gz
# cd apr-1.5.2
# ./configure --prefix=/usr/local/apr
# make && make install
(2) 编译安装apr-util
# tar xf apr-util-1.5.4.tar.gz
# cd apr-util-1.5.4
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
# make && make install
2、编译安装httpd-2.4.23
# wget http://mirrors.tuna.tsinghua.edu.cn/apache//httpd/httpd-2.4.23.tar.gz
# tar xf httpd-2.4.23.tar.gz
# cd httpd-2.4.23
# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=all --with-mpm=event
# make && make install
3、修改httpd的主配置文件,设置其Pid文件的路径
编辑/etc/httpd24/httpd.conf,添加如下行即可:
PidFile "/var/run/httpd.pid"
4、提供SysV服务脚本/etc/rc.d/init.d/httpd,内容如下:(文字所限,此处省略)
为此脚本赋予执行权限:
# chmod +x /etc/rc.d/init.d/httpd
加入服务列表:
# chkconfig --add httpd
修改PATH环境变量,让系统可以直接使用http的相关命令
# vim /etc/profile.d/http.sh
# export PATH=/usr/local/apache/bin:$PATH
# source /etc/profile.d/http.sh
启动服务进行测试
# service httpd start
二、安装mysql-5.5.52
1、准备数据存放目录
# mkdir -pv /mydata/data
2、新建用户以安全方式运行进程:
# groupadd -r mysql
# useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data mysql
# chown -R mysql:mysql /mydata/data
3、安装并初始化mysql-5.5.52
# cd /usr/local/
# wget http://ftp.ntu.edu.tw/pub/MySQL/Downloads/MySQL-5.5/mysql-5.5.52-linux2.6-x86_64.tar.gz
# tar xf mysql-5.5.52-linux2.6-x86_64.tar.gz
# ln -sv mysql-5.5.52-linux2.6-x86_64 mysql
# cd mysql
# chown -R mysql:mysql .
# scripts/mysql_install_db --user=mysql --datadir=/mydata/data
# chown -R root .
4、为mysql提供主配置文件:
# cd /usr/local/mysql
# cp support-files/my-large.cnf /etc/my.cnf
# vim /etc/my.cnf
并修改此文件中thread_concurrency的值为你的CPU个数乘以2
thread_concurrency = 2
指定mysql数据文件的存放位置:
datadir = /mydata/data
5、为mysql提供sysv服务脚本:
# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
# chmod +x /etc/rc.d/init.d/mysqld
添加至服务列表:
# chkconfig --add mysqld
# chkconfig mysqld on
启动服务测试
6、输出mysql的man手册至man命令的查找路径:
编辑/etc/man.config,添加如下行即可:
MANPATH /usr/local/mysql/man
7、输出mysql的头文件至系统头文件路径/usr/include:
这可以通过简单的创建链接实现:
# ln -sv /usr/local/mysql/include /usr/include/mysql
8、输出mysql的库文件给系统库查找路径:
# echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf
而后让系统重新载入系统库:
# ldconfig
9、修改PATH环境变量,让系统可以直接使用mysql的相关命令。具体实现过程这里不再给出。
vim /etc/profile.d/mysql.sh
export PATH=/usr/local/mysql/bin:$PATH
# source /etc/profile.d/mysql.sh
三、编译安装php-5.5.38
1、解决依赖关系:
请配置好yum源(系统安装源及epel源)后执行如下命令:
# yum -y groupinstall "Desktop Platform Development"
# yum -y install bzip2-devel libmcrypt-devel libxml2-devel php-mysql
2、编译安装php-5.5.38
# cd /usr/local/
wget -c http://cn2.php.net/get/php-5.5.38.tar.gz/from/this/mirror -O php-5.5.38.tar.gz
# tar tar xf php-5.5.38.tar.gz
# cd php-5.5.38
# ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --enable-sockets --with-apxs2=/usr/local/apache/bin/apxs --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2 --enable-maintainer-zts
# make
# make test
# make intall
为php提供配置文件:
# cp php.ini-production /etc/php.ini
3、 编辑apache配置文件httpd.conf,以apache支持php
# vim /etc/httpd24/httpd.conf
1、添加如下二行
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
2、定位至DirectoryIndex index.html
修改为:
DirectoryIndex index.php index.html
而后重新启动httpd,或让其重新载入配置文件即可测试php是否已经可以正常使用。
service httpd restart
# vim /usr/local/apache/htdocs/index.php
测试页面index.php示例如下:
<?php
$conn = mysql_connect('127.0.0.1','root','');
if ($conn)
echo "OK";
else
echo "Failure";
?>
四、安装wordpress-4.5.3
1、创建数据库并授权
# mysql
mysql> CREATE DATABASE wpdb
mysql> GRANT ALL ON wpdb.* TO wpuser@'192.168.%.%' IDENTIFIED BY 'wppass';
2、安装wordpress-4.5.3
# cd /usr/local/apache/htdocs/
# wget https://cn.wordpress.org/wordpress-4.5.3-zh_CN.zip
# unzip wordpress-4.5.3-zh_CN.zip
# cd wordpress
# cp wp-config-sample.php wp-config.php
# vim wp-config.php
/** WordPress数据库的名称 */
define('DB_NAME', 'wpdb');
/** MySQL数据库用户名 */
define('DB_USER', 'wpuser');
/** MySQL数据库密码 */
define('DB_PASSWORD', 'wppass');
/** MySQL主机 */
define('DB_HOST', '192.168.2.14');
在浏览器中输入http://192.168.2.14/wordpress,输入相应文字完成安装
4、建立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、创建虚拟主机目录与index.html文件
mkdir -pv /web/vhosts/www{1,2}
echo "www1.stuX.com" > /web/vhosts/www1/index.html
echo "www2.stuX.com" > /web/vhosts/www2/index.html
2、创建虚拟主机日志文件
mkdir /var/log/httpd
touch /var/log/httpd/www{1,2}.{err,access}
3、主配置文件包含虚拟主机配置文件
vim /etc/httpd24/httpd.conf
#Include /etc/httpd24/extra/httpd-vhosts.conf 删除前面的#号
4、编辑虚拟主机配置文件
vim /etc/httpd24/extra/httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot "/web/vhosts/www1"
ServerName www1.stuX.com
ErrorLog "/var/log/httpd/www1.err"
CustomLog "/var/log/httpd/www1.acess" common
<Directory "/web/vhosts/www1">
Options None
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/web/vhosts/www2"
ServerName www2.stuX.com
ErrorLog "/var/log/httpd/www2.err"
CustomLog "/var/log/httpd/www2.acess" common
<Directory "/web/vhosts/www2">
Options None
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
5、通过www1.stuX.com/server-status输出httpd工作状态相关信息配置
vim /etc/httpd24/extra/httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot "/web/vhosts/www1"
ServerName www1.stuX.com
ErrorLog "/var/log/httpd/www1.err"
CustomLog "/var/log/httpd/www1.acess" common
<Directory "/web/vhosts/www1">
Options None
AllowOverride None
Require all granted
</Directory>
<Location /server-status>
SetHandler server-status
AuthType Basic
AuthName "Web Auth Server-status"
AuthUserFile "/etc/httpd24/extra/.htpasswd"
Require user status
</location>
</VirtualHost>
6、生成.htpasswd 文件 及status 帐号密码
htpasswd -c -m /etc/httpd24/extra/.htpasswd status
重启httpd服务
service httpd restart
7、在浏览器输入http://www1.stux.com/server-status 进行测试
5、为第4题中的第2个虚拟主机提供https服务,使得用户可以通过https安全的访问此web站点;
(1)要求使用证书认证,证书中要求使用的国家(CN)、州(HA)、城市(ZZ)和组织(MageEdu);
(2)设置部门为Ops,主机名为www2.stuX.com,邮件为admin@stuX.com;
1.构建私有CA
生成私钥
# (umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 4906)
生成自签证书
# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
为CA提供所需的目录及文件
# mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
# touch /etc/pki/CA/{serial,index.txt}
# cd /etc/pki/CA
# echo 01 > /etc/pki/CA/serial
2.要用到证书进行安全通信的服务器,向CA请求签署证书
用到证书的主机生成私钥
# mkdir /etc/httpd/ssl
# mkdir -pv /etc/httpd/ssl
# cd /etc/httpd/ssl
# (umask 077;openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
# 生成证书签署请求
openssl req -new -key /etc/httpd24/ssl/httpd.key -out /etc/httpd24/ssl/httpd.csr -days 365
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
在CA主机上签署证书
# openssl ca -in /etc/httpd24/ssl/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
3.修改主配置文件,加载相关模块
# vim /etc/httpd24/httpd.conf
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule ssl_module modules/mod_ssl.so
Include /etc/httpd24/extra/httpd-ssl.conf
修改http-ssl.conf
<VirtualHost 192.168.2.14:443>
DocumentRoot "/web/vhosts/www2"
ServerName www2.stuX.com:443
ServerAdmin admin@magedu.com
ErrorLog "/usr/local/apache/logs/error_log"
TransferLog "/usr/local/apache/logs/access_log"
<Directory "/web/vhosts/www2">
Options None
AllowOverride None
Require all granted
</Directory>
SSLCertificateFile "/etc/httpd24/ssl/httpd.crt"
SSLCertificateKeyFile "/etc/httpd24/ssl/httpd.key"
</VirtualHost>
6、在LAMP架构中,请分别以php编译成httpd模块形式和php以fpm工作为独立守护进程的方式来支持httpd,列出详细的过程。
1.php编译成httpd模块形式(请看第3题)
2.编译安装fpm方式工作的php
yum groupinstall -y "Desktop Platform Development"
yum install -y libmcrypt-devel
yum install -y bzip2-devel
cd /usr/local/
tar xf php-5.5.38.tar.gz
cd php-5.5.38
./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --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
其中—enable-fpm 选项指定php为使用fpm工作方式
make
make intall
(1)配置php-fpm
为php-fpm提供SysV init脚本,并将其添加至服务列表:
cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm
给脚本执行权限
chmod +x /etc/rc.d/init.d/php-fpm
将脚本加入运行级别并设置为开机启动
chkconfig --add php-fpm
chkconfig php-fpm on
为php-fpm提供配置文件:
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
编辑php-fpm的配置文件:
vim /usr/local/php/etc/php-fpm.conf
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 8
pid = /usr/local/php/var/run/php-fpm.pid
启动php-fpm:
service php-fpm start
(2)配置httpd-2.4.9
# vim /etc/httpd/httpd.conf
1、加载proxy_module,proxy_fcgi_module模块,删除如下两行前面的#号
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
2、使apache支持php文件,添加如下两行,
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
3、修改DirectoryIndex为:
DirectoryIndex index.php index.html
4、添加php页面重定向,使得php页面的请求都转到php-fpm服务
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/usr/local/apache/htdocs/$1
5、在创建index.php文件进行测试
vim /usr/local/apache/htdocs/index.php
<?php
phpinfo();
?>
原创文章,作者:N22_上海_长清,如若转载,请注明出处:http://www.178linux.com/60501


评论列表(1条)
整体实战部分写的不错,另外在描述http请求的过程中,最好和tcp/ip协议一起串起来,这部分是息息相关的,知识需要拓展后才能掌握的更全面。