1、描述一次完整的http请求处理过程
简介 一次完整的HTTP请求过程从TCP三次握手建立连接成功后开始,客户端按照指定的格式开始向服务端发送HTTP请求,服务端接收请求后,解析HTTP请求,处理完业务逻辑,最后返回一个HTTP的响应给客户端,HTTP的响应内容同样有标准的格式。无论是什么客户端或者是什么服务端,大家只要按照HTTP的协议标准来实现的话,那么它一定是通用的
1)客户端发起http请求阶段
客户端在与服务端TCP三次握手建立连接成功后,开始按照指定的格式开始向服务端发送HTTP请求。HTTP请求格式主要有四部分组成,分别是:请求行、请求头、空行、消息体,每部分内容占一行
请求行:请求行是请求消息的第一行,由三部分组成:分别是请求方法(GET/POST/DELETE/PUT/HEAD)、请求资源的URI路径、HTTP的版本号
请求头:请求头中的信息有和缓存相关的头(Cache-Control,If-Modified-Since)、客户端身份信息(User-Agent)等等。
消息体:请求体是客户端发给服务端的请求数据,这部分数据并不是每个请求必须的。
2)服务端接收客户端http请求阶段
服务端接收来自于网络上的主机请求报文中对某特定资源的一次请求的过程
3)服务端处理客户端http请求阶段
对请求报文进行解析,获取客户端请求的资源及请求方法等相关信息;根据请求报文的头信息,来确定请求合适,编码等
4)服务端根据客户端http请求与访问自己本地资源
获取请求报文中请求的资源,根据请求,从应用->系统内核->驱动->资源存放媒介(硬盘、内存)获取客户端需要的信息
5)服务端构建http响应报文
服务器接收处理完请求后返回一个HTTP相应消息给客户端。HTTP响应消息的格式包括:状态行、响应头、空行、消息体。每部分内容占一行。
状态行:状态行位于相应消息的第一行,有HTTP协议版本号,状态码和状态说明三部分构成。
响应头:响应头是服务器传递给客户端用于说明服务器的一些信息,以及将来继续访问该资源时的策略。
响应体:响应体是服务端返回给客户端的HTML文本内容,或者其他格式的数据,比如:视频流、图片或者音频数据。
状态码:HTTP的响应状态码由5段组成:
- 1xx 消息,一般是告诉客户端,请求已经收到了,正在处理,别急…
- 2xx 处理成功,一般表示:请求收悉、我明白你要的、请求已受理、已经处理完成等信息.
- 3xx 重定向到其它地方。它让客户端再发起一个请求以完成整个处理。
- 4xx 处理发生错误,责任在客户端,如客户端的请求一个不存在的资源,客户端未被授权,禁止访问等。
- 5xx 处理发生错误,责任在服务端,如服务端抛出异常,路由出错,HTTP版本不支持等。
6)服务端将http响应报文发送给客户端
就是在已建立的tcp链接之上将相应报文及客户请求的数据从应用层,传输层、传输层、链路层、物理层层层打包头依次传输到客户端的物理层、链路层、传输层、应用层层层解包,最后客户端获得自己http请求的数据。
7)服务器关闭tcp连接
2、httpd所支持的处理模型有哪些,他们分别使用于哪些环境
1)prefork:多进程模型,每个进程响应一个请求;一个主进程负责生成n个子进程,子进程也成为工作进程,每个子进程处理一个用户请求;即便没有用户请求,也会预先生成多个空闲进程,随时等待请求到达;最大不会超过1024个;
优点:成熟稳定,兼容所有新老模块。
缺点:一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求,理论上不会超过1024个,在大并发场景下,它会将请求放进队列中,一直等到有可用进程,请求才会被处理。
2)worker:多线程模型,每个线程响应一个请求;一个主进程生成多个子进程,每个子进程负责生成多个线程,每个线程响应一个请求;如有m个进程,每个进程有n个线程,则可处理的请求个数为:m*n
优点:占据更少的内存,高并发下表现更优秀。
缺点:
(1)线程的管理要比进程复杂得多。线程之间很多资源是共享的,所以它没有prefork模型那种一个进程服务一个服务请求那么安全稳定;
(2)worker是一个线程服务一个请求,在请求没有完成之前,该线程是与它服务的请求绑定的。worker需要大量的创建进程生成线程,销毁线程,杀死进程的过程;
(3)由于linux不是真线程的操作系统,所以worker在linux上的表现与prefork相比并没有明显优势。
3)event:事件驱动模型,是基于信号驱动I/O 通知机制,每个线程响应n个请求;
优点:并发能力强,并且解决了worker模型下由于线程与请求绑定而导致的线程资源浪费的问题;
缺点:2.4之前的版本仅为测试用,只有2.4之后event才可在生产使用。
3、源码编译安装LAMP环境(基于wordpress程序),并写出详细的安装、配置、测试过程
首先编译安装httpd
下载安装源码包 apr apr-util httpd
安装环境 [root@localhost ~]# yum -y groupinstall “Development Tools” “Server Platform Development”
yum -y install expat-devel zlib zlib-devel openssl openssl-devel gcc build-essential pcre-devel
然后编译安装apr
tar xf apr-1.6.3.tar.gz
cd apr-1.6.3
./configure –prefix=/usr/local/apr
make && make install
然后编译apr-util
tar xf apr-util-1.6.1.tar.gz
cd apr-util-1.6.1
./configure –prefix=/usr/local/apr-util –with-apr=/usr/local/apr
make && make install
然后编译安装httpd
tar xf httpd-2.4.29.tar.gz
./configure –prefix=/usr/local/apache24 –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=prefork –libdir=/usr/lib64/
make && make install
设置环境变量
vim /etc/profile.d/httpd.sh
chmod +x /etc/profile.d/httpd.sh
exec /etc/profile.d/httpd.sh
防火墙设置
[root@localhost]# iptables -A INPUT -s 0/0 -d 192.168.208.129 -p tcp -j ACCEPT
[root@localhost]# iptables -A OUTPUT -d 0/0 -s 192.168.208.129 -p tcp -j ACCEPT
编译安装mariadb
yum -y install ncurses-devel
yum -y install cmake
tar xf mariadb-5.5.57.tar.gz
ln -sv mariadb-5.5.57 mysql
cd mysql/
groupadd -r -g 300 mysql
cd mysql/
chown -R root:mysql ./*
mkdir -pv /mydata/data
useradd mysql -u 27 -g 300
chown mysql:mysql /mydata/data/ -R
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/mydata/data -DSYSCONFDIR=/etc -DWITHOUT_TOKUDB=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STPRAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWIYH_READLINE=1 -DWIYH_SSL=system -DVITH_ZLIB=system -DWITH_LOBWRAP=0 -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci
make && make install
./scripts/mysql_install_db –user=mysql –basedir=/usr/local/mysql/ –datadir=/mydata/data/ –skip-name-resolve
mv /etc/my.cnf{,.bak}
cp support-files/my-large.cnf /etc/my.cnf
cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[root@localhost ~]# vim /etc/my.cnf
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
# Try number of CPU’s*2 for thread_concurrency
thread_concurrency = 8
datadir = /mydata/data
basedir = /usr/local/mysql
skip_name_resolve = ON
innodb_file_per_table = ON
cd /etc/rc.d/init.d/
chmod +x mysqld
service mysql start
chkconfig –list mysqld
vim /etc/profile.d/mysql.sh
export PATH=/usr/local/mysql/bin:$PATH
chmod +x /etc/profile.d/mysql.sh
exec /etc/profile.d/mysql.sh
编译安装php
tar xf php-5.6.32.tar.gz
yum -y install bzip2-devel libmcrypt-devel libxml2-devel php-mysql
libmcrypt-devel这个组件默认光盘里没有,要用有epel源rpm安装
vim /etc/yum.repos.d/epel.repo
[epel]
name=Fedora EPEL
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/
gpgcheck=0
cd php-5.6.32
./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/apache24/bin/apxs –with-mcrypt –with-config-file-path=/etc/ –with-config-file-scan-dir=/etc/php.d –with-bz2 –enable-maintainer-zts
make && make install
修改httpd.conf文件
添加AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
修改 DirectoryIndex index.html index.php
测试:cd /usr/local/apache24/htdocs/
vim index.php
<?php
phpinfo();
?>
安装wordpress
wget https://cn.wordpress.org/wordpress-4.8.1-zh_CN.zip
[root@localhost wordpress]# unzip wordpress-4.8.1-zh_CN.zip
cp wp-config-sample.php wp-config.php
vim wp-config.php
MariaDB [mysql]> CREATE DATABASE wpdb;
MariaDB [mysql]> GRANT ALL ON wpdb.* TO wpuser@’192.168.%.%’ IDENTIFIED BY ‘wppass’;
MariaDB [mysql]> flush priviliges;
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);
mkdir -pv /web/vhosts/{www1,www2}
vim /web/vhosts/www1/index.html
vim /web/vhosts/www2/index.html
然后编辑httpd.conf
去掉# 启用虚拟主机
Include conf/extra/httpd-vhosts.conf
然后在最后添加
<Directory “/web/vhosts/www1”>
options none
allowoverride none
Require all granted
</Directory>
<Directory “/web/vhosts/www2”>
options none
allowoverride none
Require all granted
</Directory>
vim /usr/local/apache24/conf/extra/httpd-vhosts.conf
mkdir /var/log/httpd/
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host.example.com
DocumentRoot “/web/vhosts/www1/”
ServerName www1.stux.com
ServerAlias www.dummy-host.example.com
ErrorLog “/var/log/httpd/www1.err”
CustomLog “/var/log/httpd/www1.access” common
</VirtualHost>
<VirtualHost *:80>
ServerAdmin webmaster@dummy-host2.example.com
DocumentRoot “/web/vhosts/www2/”
ServerName www2.stux/com
ErrorLog “/var/log/httpd/www2.err”
CustomLog “/var/log/httpd/www2.access” common
</VirtualHost>
在C:\Windows\System32\drivers\etc中找到host文件,然后添加
192.168.208.129 www1.stux.com
192.168.208.129 www2.stux.com
编辑httpd-vhosts.conf文件
<VirtualHost *:80>
DocumentRoot “/web/vhosts/www1/”
ServerName www1.stux.com
ServerAlias www.dummy-host.example.com
ErrorLog “/var/log/httpd/www1.err”
CustomLog “/var/log/httpd/www1.access” common
<Location “/server-status”>
SetHandler server-status
Options None
AllowOverride None
AuthType Basic
AuthName “Admin”
AuthUserfile “/usr/local/apache24/.htpasswd”
Require user status
</Location>
</VirtualHost>
5、为第四题中的第2个虚拟主机提供https服务,使得用户可以通过https安全的访问此web站点;
1)要求使用证书认证,证书中要求使用的国家(CN)、州(HA)、城市(ZZ)和组织(MageEdu);
2)设置部门为Ops,主机名为www2.stuX.com,邮件为admin@stuX.com
第一步:CA服务器生成私钥
[root@centos ~]# cd /etc/pki/CA/
[root@centos CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
……………….+++
……………………………………………………………………..+++
e is 65537 (0x10001)
[root@centos CA]#
第二步:CA服务器生成自签证书
[root@centos CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365
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
第三步:为CA提供所需的目录及文件
[root@centos CA]# touch serial index.txt
[root@centos CA]# echo 01 > serial
第四步:web服务器生成私钥
[root@localhost ~]# cd /usr/local/apache24/
[root@localhost apache24]# mkdir ssl
[root@localhost apache24]# cd ssl/
[root@localhost ssl]# (umask 077;openssl genrsa -out httpd.key 1024)
Generating RSA private key, 1024 bit long modulus
………………………………………………….++++++
………………………++++++
e is 65537 (0x10001)
第五步:web服务器生成证书签署请求
[root@localhost ssl]# openssl req -new -key httpd.key -out httpd.csr -days 365
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 []:
第六步:web服务器将请求发给CA服务器
[root@localhost ssl]# scp httpd.csr root@192.168.208.128:/tmp
第七步:CA服务器签署证书
[root@centos CA]# openssl ca -in /tmp/httpd.csr -out 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: 1 (0x1)
Validity
Not Before: Nov 11 01:15:00 2017 GMT
Not After : Nov 11 01:15:00 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:
22:C3:53:3A:22:1A:BA:00:47:0E:9E:93:26:58:D9:E6:7D:5D:27:E4
X509v3 Authority Key Identifier:
keyid:AB:86:4B:09:28:03:65:A8:F9:63:02:A9:35:36:3F:3C:BB:03:E4:0B
Certificate is to be certified until Nov 11 01:15:00 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
第八步:CA服务器将证书发送到web服务器
[root@centos CA]# scp certs//httpd.crt 192.168.208.129:/usr/local/apache24/ssl/
第九步:配置httpd支持ssl
[root@localhost ssl]# yum -y install mod_ssl
启用ssl模块
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule ssl_module modules/mod_ssl.so
Include conf/extra/httpd-ssl.conf
[root@localhost extra]# vim httpd-ssl.con
<Directory “/web/vhosts/www2/”>
Options None
AllowOverride None
Require all granted
</Directory>
修改SSLCertificateFile “/usr/local/apache24/ssl/httpd.crt”
SSLCertificateKeyFile “/usr/local/apache24/ssl/httpd.key”
第十步:将caert.pem导入受信任机构
将httpd.crt导入
打开https站点
6、在LAMP架构中,请分别以php编译成httpd模块形式和php以fpm工作为独立守护进程的方式来支持httpd,列出详细的过程
[root@localhost]# yum -y install httpd php-fpm mariadb-server php-mysql
[root@localhost]# vim /etc/php-fpm.d/www.conf
修改listen = 0.0.0.0:9000
[root@localhost ~]# vim /etc/php-fpm.d/www.conf
#设置默认主页
DirectoryIndex index.php
#是否开启正向代理
ProxyRequests off
#.php后缀的URL请求转发给后端,$1表示小括号内的内容
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1
[root@localhost ~]# vim /var/www/html/index.php
<?php
phpinfo();
?>
[root@localhost ~]# systemctl start php-fpm
[root@localhost ~]# systemctl start httpd
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/88316
评论列表(1条)
作业写的不错,赞。