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程序),并写出详细的安装、配置、测试过程。
(1)安装二进制mariadb包
准备数据目录:
[root@localhost ~]# mkdir -pv /mydata/data/
[root@localhost mysql]# chown mysql:mysql /mydata/data/ -R
解压mariadb包至/usr/local/目录下:
[root@localhost ~]# tar -zxf mariadb-5.5.53-linux-x86_64.tar.gz -C /usr/local
切换至/user/local/目录下:
[root@localhost ~]# cd /usr/local
把mariadb-5.5.53-linux-x86_64/目录软链接为mysql目录:
[root@localhost local]# ln -sv mariadb-5.5.53-linux-x86_64/ mysql
切换工作目录至/usr/local/mysql:
[root@localhost local]# cd /usr/local/mysql
修改/usr/local/mysql/目录下所有文件和子目录的属主,属组:
[root@localhost mysql]# chown -R root:mysql ./*
创建/etc/mysql/目录,并复制 support-files/my-large.cnf到/etc/mysql/目录下,更名为my.cnf
[root@localhost mysql]# mkdir /etc/mysql
[root@localhost mysql]# cp support-files/my-large.cnf /etc/mysql/my.cnf
编辑/etc/mysql/my.cnf文件:
[root@localhost mysql]# vim /etc/mysql/my.cnf
(在[mysqld]段下面加入以下三行)
datadir = /mydata/data
skip_name_resolve = ON
innodb_file_per_table = ON
初始化mysql数据库:
[root@localhost mysql]# scripts/mysql_install_db –user=mysql –datadir=/mydata/data
创建mysql服务启动脚本:
[root@localhost mysql]# cp support-files/mysql.server /etc/init.d/mysqld
[root@localhost mysql]# chkconfig –add mysqld
把/etc/my.cnf文件移到/tmp目录下:
[root@localhost mysql]# mv /etc/my.cnf /tmp/
启动mysql服务:
[root@localhost mysql]# service mysqld start
修改PATH变量:
[root@localhost mysql]# vim /etc/profile.d/mysql.sh
export PATH=/usr/local/mysql/bin:$PATH
重载配置文件:
[root@localhost mysql]# . /etc/profile.d/mysql.sh
添加/usr/local/mysql/lib/目录下的库文件到系统搜索路径下:
[root@localhost mysql]# vim /etc/ld.so.conf.d/mysql.conf
/usr/local/mysql/lib
[root@localhost mysql]# ldconfig
(2)编译安装httpd2.4
配置编译前环境:
[root@localhost mysql]# yum groupinstall Development Tools Server Platment Development
[root@localhost ~]# yum install pcre-devel
[root@localhost httpd-2.4.23]# yum install apr-util-devel
[root@localhost httpd-2.4.23]# yum install apr-devel
[root@localhost httpd-2.4.23]# yum install openssl-devel
解压缩httpd-2.4.23.tar.gz包:
[root@localhost ~]# tar -zxf httpd-2.4.23.tar.gz
切换到httpd-2.4.23目录下:
[root@localhost ~]# cd httpd-2.4.23
编译安装:
[root@localhost httpd-2.4.23]#./configure –prefix=/usr/local/apache24 –sysconfdir=/etc/httpd24 –enable-so –enable-ssl –enable-rewrite –with-zlib –with-pcre –with-apr=/usr –with-apr-util=/usr –enable-modules=most –enable-mpms-shared=all –with-mpm=prefork
[root@localhost httpd-2.4.23]# make && make install
创建httpd服务启动脚本:
[root@localhost httpd-2.4.23]# vim /etc/profile.d/httpd.sh
export PATH=/usr/local/apache24/bin:$PATH
重载脚本:
[root@localhost httpd-2.4.23]# . /etc/profile.d/httpd.sh
启动httpd服务
[root@localhost httpd-2.4.23]# apachectl start
(3)编译安装php
实验环境下没有Libmcrypt包,由于安装php时需要,yum源也没有提供该软件包,事先编译安装Libmcrypt至/usr/local/libmcrypt目录下(此过程略过)
配置编译前环境:
[root@localhost ~]# yum install libxml2-devel libmcrypt-devel bzip2-devel
解压缩源码包:
[root@localhost ~]# tar -xf php-5.5.38.tar.xz
切换工作目录到 php-5.5.38:
[root@localhost ~]# cd php-5.5.38
安装php:
[root@localhost 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-png-dir –with-jpeg-dir –with-freetype-dir –with-zlib –with-libxml-dir=/usr –enable-xml –enable-sockets –with-apxs2=/usr/local/apache24/bin/apxs –with-mcrypt=/usr/local/libmcrypt –with-config-file-path=/etc –with-config-file-scan-dir=/etc/php.d –with-bz2
[root@localhost php-5.5.38]# make && make install
复制php的配置文件至/etc目录下:
[root@localhost php-5.5.38]# cp php.ini-production /etc/php.ini
编辑/etc/httpd24/httpd.conf文件:
[root@localhost httpd24]# vim httpd.conf
加入下面两行:
DirectoryIndex index.php index.html
AddType application/x-httpd-php .php
(4)解压缩wordpress包:
切换到/usr/local/apache24/htdocs/目录下:
[root@localhost ~]# cd /usr/local/apache24/htdocs/
解压缩:
[root@localhost htdocs]# tar -xf wordpress-4.5.3-zh_CN.tar.gz
切换到wordpress目录下:
[root@localhost htdocs]# cd wordpress/
复制一份wordpress配置文件:
[root@localhost wordpress]# cp wp-config-sample.php wp-config.php
登陆mariadb数据数据库:
[root@localhost wordpress]# mysql
授权用户:
ariaDB [(none)]> grant all on wpdb.* to wpuser@'192.168.1.%' identified by 'wppass';
创建数据库:
MariaDB [(none)]> create database wpdb;
编辑wp-config.php文件:
[root@localhost wordpress]# vim wp-config.php
/** WordPress数据库的名称 */
define('DB_NAME', 'wpdb'); (修改为wpdb数据库)
/** MySQL数据库用户名 */
define('DB_USER', 'wpuser'); (修改为wpuser用户)
/** MySQL数据库密码 */
define('DB_PASSWORD', 'wppass'); (修改密码为wppass)
/** MySQL主机 */
define('DB_HOST', '192.168.1.111'); (修改192.168.1.111这台主机可以访问mysql)
至此所有配置完成。
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);
由于字数限制这里就不写如何编译安装httpd,在第三题已经写过安装过程了。
建立主页文件:
[root@localhost ~]# mkdir -p /web/vhosts/{www1,www2}
[root@localhost ~]# vim /web/vhosts/www1/index.html
<h1>www1.stuX.com</h1>
[root@localhost ~]# vim /web/vhosts/www2/index.html
<h1>www2.stuX.com</h1>
配置虚拟主机:
<VirtualHost 192.168.1.111:80>
ServerName www1.stuX.com
DocumentRoot "/web/vhosts/www1"
ErrorLog /var/log/httpd/www1.err
CustomLog /var/log/httpd/www1.access combined
<Directory "/web/vhosts/www1">
Options None
AllowOverride None
Require all granted
</Directory>
<Location "/server-status">
SetHandler server-status
Options None
AllowOverride None
AuthType Basic
AuthName "Adimin Realm,show something"
AuthUserFile "/etc/httpd24/extra/.htpasswd"
Require user join
</Location>
</VirtualHost>
<VirtualHost 192.168.1.111:80>
ServerName www2.stuX.com
DocumentRoot "/web/vhosts/www2"
ErrorLog /var/log/httpd/www1.err
CustomLog /var/log/httpd/www1.access combined
<Directory "/web/vhosts/www2">
Options None
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
创建存储用户和密码的文件:
[root@localhost extra]# htpasswd -c -m /etc/httpd24/extra/.htpasswd join
New password:
Re-type new password:
Adding password for user join
5、为第4题中的第2个虚拟主机提供https服务,使得用户可以通过https安全的访问此web站点;
(1)要求使用证书认证,证书中要求使用的国家(CN)、州(HA)、城市(ZZ)和组织(MageEdu);
(2)设置部门为Ops,主机名为www2.stuX.com,邮件为admin@stuX.com;
在192.168.1.120主机上创建CA:
生成CA私钥:
[root@localhost CA]# (umask 077; openssl genrsa -out private/cakey.pem 2048)
创建自签证书:
[root@localhost CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem
[root@localhost CA]# touch serial index.txt
[root@localhost CA]# echo 01> serial
在httpd服务器上生成自己的私钥:
[root@localhost httpd24]# mkdir ssl
[root@localhost httpd24]# cd ssl
[root@localhost ssl]# (umask 077; openssl genrsa -out httpd.key 1024)
生成请求签署证书:
[root@localhost ssl]# openssl req -new -key httpd.key -out httpd.csr
发送到CA签发证书:
[root@localhost ssl]# scp httpd.csr root@192.168.1.120:/tmp/
在CA上签发证书:
[root@localhost CA]# openssl ca -in /tmp/httpd.csr -out certs/httpd.crt
将证书发送给客户端:
[root@localhost CA]# scp certs/httpd.crt 192.168.1.111:/etc/httpd24/ssl/
在httpd服务器上配置ssl:
[root@localhost conf]# vim /etc/httpd24/extra/httpd-ssl.conf
(修改以下四项内容)
DocumentRoot "/web/vhosts/www2"
ServerName www2.stuX.com
SSLCertificateFile /etc/httpd24/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd24/ssl/httpd.key
编辑httpd.conf文件:
[root@localhost conf]# vim /etc/httpd24/httpd.conf
(将以下两行开头的“#”删除即可)
LoadModule ssl_module modules/mod_ssl.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
重启httpd服务:
[root@localhost ~]# apachectl restart
6、在LAMP架构中,请分别以php编译成httpd模块形式和php以fpm工作为独立守护进程的方式来支持httpd,列出详细的过程。
由于字数限制这里就不写如何将php编译成httpd模块形式了,在第三题已经写过该模式的编译过程
下面列出php以fpm工作为独立守护进程的编译过程:
在源码包中复制php配置文件至/etc/目录下,并更名为php.ini
[root@localhost php-5.5.38]# cp php.ini-production /etc/php.ini
创建并编辑php-fmp服务的配置文件:
[root@localhost etc]# cp php-fpm.conf.default php-fpm.conf
[root@localhost etc]# vim php-fpm.conf
pid = /usr/local/php/var/run/php-fpm.pid
listen = 192.168.1.120:9000
listen.allowed_clients = 192.168.1.125
创建php-fpm服务启动脚本:
[root@localhost php-5.5.38]# cp sapi/fpm/init.d.php-fpm /etc/rc.d/init.d/php-fpm
[root@localhost etc]# chmod +x /etc/rc.d/init.d/php-fpm
[root@localhost php-5.5.38]# chkconfig -add php-fpm
启动php-fpm服务:
[root@localhost etc]# service php-fpm start
httpd服务器的配置
[root@localhost ~]# vim /etc/httpd/conf.modules.d/00-proxy.conf
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
AddType application/x-httpd-php .php
[root@localhost ~]# vim /etc/httpd/conf.d/fcgi-conf
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://192.168.1.111:9000/var/www/html/$1
原创文章,作者:heianyangguo,如若转载,请注明出处:http://www.178linux.com/56483
评论列表(1条)
我觉得你的mariadb用户授权少了一步FLUSH PRIVILEGES; 有可能影响你的wp连接db。