1. 请描述一次完整的http请求处理过程。
三次握手:
主机A 通过向主机B 发送一个含有同步序列号的标志位的数据段给主机B,向主机B 请求建立连接,通过这个数据段,主机A告诉主机B 两件事:我想要和你通信;你可以用哪个序列号作为起始数据段来回应我;
主机B 收到主机A的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应主机A,也告诉主机A两件事:我已经收到你的请求了,你可以传输数据了;你要用哪佧序列号作为起始数据段来回应我;
主机A 收到这个数据段后,再发送一个确认应答,确认已收到主机B 的数据段;我已收到回复,我现在要开始传输实际数据了。
这样TCP三次握手就完成了,主机A和主机B 就可以传输数据了。三次握手的特点:没有应用层的数据,SYN这个标志位只有在TCP建产连接时才会被置1,握手完成后SYN标志位被置0。
TCP建立连接要进行三次握手,而断开连接要进行四次,这是由于TCP的半关闭造成的,因为TCP连接是全双工的(即数据可在两个方向上同时传递)所以进行关闭时每个方向上都要单独进行关闭,这个单方向的关闭就叫半关闭。关闭的方法是一方完成它的数据传输后,就发送一个FIN来向另一方通告将要终止这个方向的连接。当一端收到一个FIN,它必须通知应用层TCP连接已终止了这个方向的数据传送,发送FIN通常是应用层进行关闭的结果。
四次断开:
当主机A完成数据传输后,将控制位FIN置1,提出停止TCP连接的请求;
主机B收到FIN后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK置1;
由B 端再提出反方向的关闭请求,将FIN置1;
主机A对主机B的请求进行确认,将ACK置1,双方向的关闭结束。
2. httpd所支持的处理模型有哪些,他们的分别使用于哪些环境。
httpd支持的模型有:prefork(2.2版本默认使用)、worker、event。
prefork模型
优点:一个进程服务一个用户请求。稳定可靠、执行效率高,任何一个进程的崩溃不会影响其它请求。
缺点:在大并发的时候对服务器资源消耗严重。
worker模型
一个进程生成多个线程,一个请求用一个线程响应。由于使用线程访问,多个线程共享同一个进程的资源,如果一个进程访问过某一个文件并且打开了,另一个线程访问就不用再次打开。
优点:在高并发的情况下,对服务器的资源消耗相对prefork模型要小很多。
缺点:执行效率、稳定性都不如prefork模型。
event模型
事件驱动模型,每个线程响应n个请求;一个主进程:生成m个子进程,每个进程直接响应n个请求;最大并发响应数是m*n。
优点:并发能力强,并且解决了worker模型下由于线程与请求绑定而导致的线程资源浪费的问题。
缺点:2.4之前的版本仅为测试用,只有2.4之后event才可在生产使用。
3. 源码编译安装LAMP环境(基于wordpress程序),并写出详细的安装、配置、测试过程。
(1)安装httpd(Apache)
./configure --prefix=/usr/local/apr
make && make install
apr-util-1.4+
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make && make install
httpd-2.4
./configure --prefix=/usr/local/httpd-2.4 --sysconfdir=/etc/httpd-2.4 --enable-so --enable-ssl --enable-cgi --enable-rewrite -enable-static-htpasswd --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=prefork
make && make install
# 启动服务
/usr/local/httpd-2.4/bin/apachectl start # 建议将apachectl 添加至系统服务
(2)安装PHP(事先需要安装一些依赖包,包括 libxml2 libxml2-devel 等等)
make
make install
注意:上述过程如果报错,针对性解决即可,常见错误是缺少依赖包。
(3)安装MySQL(mariadb)
先安装依赖包:yum install -y ncurses-devel openssl-devel openssl gcc-c++ cmake,可能还有其他依赖包,后面缺什么就装什么。
进入MariaDB源码目录,执行cmake
make
make install
# 如果上述过程报错,解决完错误后,需要执行下列命令,再重新执行编译操作。
make clean
rm -f CMakeCache.txt
rm -rf /etc/my.cnf
groupadd mysql
useradd -r -g mysql mysql
# 指定mariadb的用户和组
chown -R mysql:mysql /usr/local/mariadb
修改相关配置
将编译目录下的配置文件my-small.cnf复制到安装目录:
# 编辑my.cnf,在mysqld标签下添加如下内容:
basedir=/usr/local/mariadb
datadir=/usr/local/mariadb/data
初始化数据库配置
进入安装目录下scripts目录,执行初始化配置脚本,创建系统自带的数据库和表
./mysql_install_db --basedir=/usr/local/mariadb --datadir=/usr/local/mariadb/data --user=mysql
# 将mariadb编译目录中support-files目录下的配置文件mysql.server复制到/etc/init.d/目录
cp mysql.server /etc/init.d/mysqld
chkconfig --add mysqld
chkconfig --list mysqld
# 启动服务
service mysqld start
如果报错:env: /etc/init.d/mysqld: Permission denied,给予权限即可:chmod a+wrx /etc/init.d/mysqld,即可正常启动
设置环境变量
export PATH=/usr/local/mariadb/bin:$PATH
# 保存后,执行命令
source /etc/profile.d/mysql.sh
设置头文件
`/usr/local/include/mariadb' -> `/usr/local/mariadb/include/'
设置库文件
/usr/local/mariadb/lib
#保存
ldconfig -v #让动态链接库为系统所共享
使用mysql_secure_installation这个脚本来进行安全配置
进入/usr/local/mariadb/bin目录,执行
# 改变root用户的密码;
# 移除匿名用户;
# 禁止root用户远程登录;
# 不移除test数据库;
# 重载授权表生效;
# 登录MySQL数据库
mysql -u root -p
# 创建WordPress数据库
MariaDB [(none)]> create database wordpress default character set utf8 collate utf8_bin;
# 创建WordPress配置文件,并修改数据库连接信息
[root@centos111 wordpress]# cp wp-config-sample.php wp-config.php
浏览器信息如下:
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)CentOS 6.8下 安装httpd(apr-1.4.2、apr-util-1.4.1、httpd-2.4.27及其他依赖包)
./configure --prefix=/usr/local/apr
make && make install
apr-util-1.4.1
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make && make install
httpd-2.4.27
./configure --prefix=/usr/local/httpd-2.4 --sysconfdir=/etc/httpd-2.4 --enable-so --enable-ssl --enable-cgi --enable-rewrite -enable-static-htpasswd --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=prefork
make && make install
/usr/local/httpd-2.4/bin/apachectl start # 启动,也可以将其添加至系统服务。
(2)新增修改相关配置文件或目录
[root@centos111 yangcheng]# mkdir -p /web/vhosts/{www1,www2}
[root@centos111 yangcheng]# echo www1.stuX.com >/web/vhosts/www1/index.html
[root@centos111 yangcheng]# echo www2.stuX.com >/web/vhosts/www2/index.html
[root@centos111 yangcheng]# touch /var/log/httpd/{www1.err,www2.err,www1.access,www2.access}
[root@centos111 conf]# vim /etc/httpd-2.4/extra/httpd-vhosts.conf #新增如下内容
<VirtualHost *:80>
ServerAdmin 463374504@qq.com
DocumentRoot "/web/vhosts/www1"
ServerName www1.stuX.com
<Directory "/web/vhosts/www1">
Options None
AllowOverride None
Require all granted
</Directory>
ErrorLog "/var/log/httpd/www1.err"
CustomLog "/var/log/httpd/www1.access" common
<Location /server-status>
SetHandler server-status
AuthType Basic
AuthName "please enter your username and password!"
AuthUserFile "/etc/httpd-2.4/extra/.htpasswd"
Require user status
</Location>
</VirtualHost>
<VirtualHost *:80>
ServerAdmin 463374504@qq.com
DocumentRoot "/web/vhosts/www2"
ServerName www2.stuX.com
<Directory "/web/vhosts/www2">
Options None
AllowOverride None
Require all granted
</Directory>
ErrorLog "/var/log/httpd/www2.err"
CustomLog "/var/log/httpd/www2.access" common
</VirtualHost>
# 保存
htpasswd -c -m /etc/httpd-2.4/extra/.htpasswd status #(如果提示命令不存在,可以进入到httpd安装目录下执行该命令)
192.168.245.111 www1.stuX.com
192.168.245.111 www2.stuX.com
至此,所有操作均已完成,效果如下图:
5. 为第4题中的第2个虚拟主机提供https服务,使得用户可以通过https安全的访问此web站点。
(1)要求使用证书认证,证书中要求使用的国家(CN)、州(HA)、城市(ZZ)和组织(MageEdu)。
(2)设置部门为Ops,主机名为www2.stuX.com,邮件为admin@stuX.com。
[root@centos111 ~]# cd /etc/pki/CA
[root@centos111 CA]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
..+++
..+++
e is 65537 (0x10001)
[root@centos111 CA]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
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
[root@centos111 CA]# cd /etc/httpd-2.4/
[root@centos111 httpd-2.4]# mkdir ssl
[root@centos111 httpd-2.4]# cd ssl
[root@centos111 ssl]# (umask 077;openssl genrsa -out httpd.key 2048)
Generating RSA private key, 2048 bit long modulus
.................................................................+++
............+++
e is 65537 (0x10001)
[root@centos111 ssl]# openssl req -new -key httpd.key -out httpd.csr -days 3655
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 []:
httpd.csr httpd.key
[root@centos111 ssl]# openssl ca -in /etc/httpd-2.4/ssl/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
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: Jul 18 11:11:30 2017 GMT
Not After : Jul 18 11:11:30 2018 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:
E4:62:B2:D4:F7:A4:14:20:1D:3B:BE:F3:69:F0:57:22:9B:9A:71:E2
X509v3 Authority Key Identifier:
keyid:C1:56:2B:0B:BB:3F:62:A5:22:C4:A8:A2:B0:5B:96:D4:A4:4A:DF:13
Certificate is to be certified until Jul 18 11:11:30 2018 GMT (365 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@centos111 ssl]# cp /etc/pki/CA/certs/httpd.crt /etc/httpd-2.4/ssl/
[root@centos111 ssl]# ll
total 16
-rw-r--r--. 1 root root 4561 Jul 18 19:19 httpd.crt
-rw-r--r--. 1 root root 1033 Jul 18 19:04 httpd.csr
-rw-------. 1 root root 1679 Jul 18 19:01 httpd.key
# vim /etc/httpd-2.4/httpd.conf, 开启 LoadModule ssl_module modules/mod_ssl.so 和 Include /etc/httpd-2.4/extra/httpd-ssl.conf 模块
# vim /etc/httpd-2.4/extra/httpd-vhosts.conf 删除www2在配置信息
# vim /etc/httpd-2.4/extra/httpd-ssl.conf 屏蔽默认SSLCertificateFile和SSLCertificateKeyFile信息
<VirtualHost 192.168.245.111:443>
ServerAdmin yc@qq.com
DocumentRoot "/web/vhosts/www2"
ServerName www2.stuX.com:443
<Directory "/web/vhosts/www2">
Options None
AllowOverride None
Require all granted
</Directory>
ErrorLog "/var/log/httpd/www2.err"
CustomLog "/var/log/httpd/www2.access" common
SSLCertificateFile "/etc/httpd-2.4/ssl/httpd.crt"
SSLCertificateKeyFile "/etc/httpd-2.4/ssl/httpd.key"
</VirtualHost>
重启时若报错:SSLSessionCache: ‘shmcb’ session cache not supported (known names: ).
开启 LoadModule socache_shmcb_module modules/mod_socache_shmcb.so 模块,重启服务即可
至此,https配置完成,如下图:
6. 在LAMP架构中,请分别以php编译成httpd模块形式和php以fpm工作为独立守护进程的方式来支持httpd,列出详细的过程。
(1)PHP编译成以httpd模块形式工作,在本次作业第3题里面已经采用。
关键点在于:
a. PHP编译时,需要加上参数 –with-apxs2=/usr/local/httpd-2.4/bin/apxs,指明httpd服务目录;(apxs2表示httpd-2.X版本)
b. 编辑httpd.conf配置文件,加上 AddType application/x-httpd-php .php,便于httpd识别PHP类型文件。
(2)PHP编译成以fpm形式工作
关键点在于:
a. 在执行configure脚本时需要使用fpm选项,而–with-apxs2这一项参数就不需要了;
b. 在Apache httpd 2.4以后已经专门有一个模块针对FastCGI的实现,此模块为mod_proxy_fcgi.so,它其实是作为mod_proxy.so模块的扩充。
因此,下面两个模块都要加载。
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
c. 配置虚拟主机支持使用fcgi
ProxyRequests Off
#把以.php结尾的文件请求发送到php-fpm进程,php-fpm至少需要知道运行的目录和URI,所以这里直接在fcgi://127.0.0.1:9000后指明了这两个参数,其它的参数的传递已经被mod_proxy_fcgi.so进行了封装,不需要手动指定。
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1
原创文章,作者:iConan,如若转载,请注明出处:https://www.aspyc.com/archives/222.html