N24_jerry 第十二周作业

1、请描述一次完整的http请求处理过程;

简介 一次完整的HTTP请求过程从TCP三次握手建立连接成功后开始,客户端按照指定的格式开始向服务端发送HTTP请求,服务端接收请求后,解析HTTP请求,处理完业务逻辑,最后返回一个HTTP的响应给客户端,HTTP的响应内容同样有标准的格式。无论是什么客户端或者是什么服务端,大家只要按照HTTP的协议标准来实现的话,那么它一定是通用的。

1、客户端发起http请求阶段

客户端在与服务端TCP三次握手建立连接成功后

开始按照指定的格式开始向服务端发送HTTP请求

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文本内容,或者其他格式的数据,比如:视频流、图片或者音频数据。

6、服务端将http响应报文发送给客户端

就是在已建立的tcp链接之上将相应报文及客户请求的数据从应用层,传输层、传输层、链路层、物理层层层打包头依次传输到客户端的物理层、链路层、传输层、应用层层层解包,最后客户端获得自己http请求的数据。

7、记录日志

服务端记录http请求访问日志

2、httpd所支持的处理模型有哪些,他们的分别使用于哪些环境。

prefork:多进程模型,每个进程响应一个请求

一个主进程:负责生成子进程及回收子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;

n个子进程:每个子进程处理一个请求;

工作模型:会预先生成几个空闲进程,随时等待用于响应用户请求;最大空闲和最小空闲;

worker:多进程多线程模型,每线程处理一个用户请求

一个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;

多个子进程:每个子进程负责生成多个线程;

每个线程:负责响应用户请求;

并发响应数量:m*n

m:子进程数量

n:每个子进程所能创建的最大线程数量;

event:事件驱动模型,多进程模型,每个进程响应多个请求

一个主进程 :负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;

子进程:基于事件驱动机制直接响应多个请求;

3、源码编译安装LAMP环境(基于wordpress程序),并写出详细的安装、配置、测试过程。

1、安装包的准备

肯定是下载源码包了啊,所谓兵马未动粮草先行,这步过于简单,我就不写了。

我准备的是以下几个包: httpd-2.4.25.tar.gz 
nginx-1.10.3.tar.gz(可选项,如果喜欢用nginx) php-5.6.30.tar.gz mariadb-10.1.21.tar.gz
openssl-1.0.2k.tar.gz wordpress-4.7.3-zh_CN.tar.gz

2、更新系统组件

CentOS:yum update

Ubuntu:apt update && apt upgrade

这一步是个人喜好,不喜勿喷~~~

3、检查原有httpd-2.2,如有请卸载

命令

rpm -qa | grep httpd

yum remove httpd*

4、安装编译以来组件包,保平安

yum groupinstall “Development Tools” “Server Platform Development”

yum install gcc gcc-c++ ncurses-devel perl cmake libaio pcre-devel openssl-devel bison.x8664 bison-devel.x8664 libxml2-devel.x86_64

5、修改主机名

6、这一步完了记得重启机器

reboot

7、编译安装Apache

httpd-2.4.25需要较新版本的apr和apr-util,因此需要事先对其进行升级。我这里用的是源码包编译安装

(1)编译安装apr

[root@LAMPW opt]# tar zxf apr-1.5.2.tar.gz

[root@LAMPW opt]# cd apr-1.5.2

[root@LAMPW apr-1.5.2]# ./configure –prefix=/opt/apr

[root@LAMPW apr-1.5.2]# make && make install

(2)编译安装apr-util

[root@LAMPW opt]# tar zxf apr-util-1.5.4.tar.gz

[root@LAMPW opt]# cd apr-util-1.5.4

[root@LAMPW apr-util-1.5.4]# ./configure –prefix=/opt/apr-util –with-apr=/opt/apr

[root@LAMPW apr-util-1.5.4]# make && make install

(3)编译安装apache2.4.25

编译参数如下:

(4)安装apache2.4.25服务脚本

编辑一下内容放到/etc/init.d/下面,附上执行权限,chkconfig –add httpd & chkconfig httpd on设置为开机启动即可,相关内容根据实际路径编辑一下即可:

(5)为httpd服务的相关命令添加环境变量

vim /etc/profile,添加以下内容:

最后echo $PATH看看,OK啦

apache2.4到此编译安装完毕,httpd.conf根据实际情况自己修改一下下啦

8.编译安装mysql-5.6.35,mysql-5.7已弃坑

(1)环境监察,看看有没有已安装的mysql相关包,有的话就卸载掉

基础了,我就不写了

(2)安装cmake,我喜欢用最新版,下载的是cmake version 3.8.0-rc2,源码编译安装,稍微麻烦,但是可以享受其过程。

well done!

(3)建立MySQL程序目录和数据存储目录

PS:其实这一步可以省略,在编译参数里面制定,make install是强制执行了,没有目录的话会自动创建,数据存放目录除外,亲测有效。

(4)创建MySQL的系统用户组和系统用户

(5)开始编译安装mysql-5.6.35

PS: 编译前要删除/etc/my.cnf,不然编译会报错。

(6)相关目录的授权

cd /data && chown -R mysql:mysql mysql_data/

cd /opt/ && chown -R mysql:mysql mysql/

(7)初始化data存放目录设置

cd /opt/mysql && scripts/mysqlinstalldb –user=mysql –basedir=/opt/mysql –datadir=/data/mysql_data

ls /data/mysql_data # 有数据说明初始化成功

(8)初始化完成后mysql中目录文件的属主应改回成root,以免被别人攻破mysql用户密码而带来数据破坏等

(9)mysql主配置文件

初始化后会自动在当前目录下创建一个my.cnf配置文件,直接修改就可以(在mysql 5.6 以后配置文件自动生成,不需要我们再进行复制),但是/usr/local/mysql/support-files目录下,有默认配置的配置文件,可以拷贝过去。这里我用默认生成的。

修改配置文件 #必须修改啊,不然下一步会报错哦

(10)为mysql提供sysv服务脚本并启动服务

service mysqld start 记得要测试OK,其中启动可能会报错,例如目录权限啊,sock 、pid 文件目录设置等,主要看看报错日志,跟着解决就好。

一通肆虐(测试)

嗦嘎!

(11)输出mysql的头文件至系统头文件路径/usr/include

(12)输出mysql的头文件至系统头文件路径/usr/include

(13)输出mysql的库文件给系统库查找路径

(14) 修改PATH环境变量,让系统可以直接使用mysql的相关命令

(15) 最终测试,使用mysql命令登录

9、编译安装php

(1)安装依赖包保平安

yum install gd-devel libmcrypt-devel libcurl-devel openssl-devel libxml2-devel

(2)下载加压,下面是编译参数

(3)从源码包复制php配置文件

cp /opt/php-5.6.30/php.ini-production /opt/php/etc/

(4) 编辑apache配置文件httpd.conf,以apache支持php ,此为httpd模块加载方式,非fastcgi模式

# vim /opt/apache24/conf/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是否已经可以正常使用。

vim /opt/apache24/htdocs/index.php 测试页面index.php示例如下:

(5) 测试是否ok

安装部署WordPress

(1)下载WordPress,并解压到网站根目录

(2)创建WordPress要连接mysql的账号

mysql>

3)创建WordPress的配置文件

[root@WebServer wordpress]# pwd

/usr/local/apache/htdocs/wordpress

[root@WebServer wordpress]# cp wp-config-sample.php wp-config.php

4)更改 wp-config.php关于数据库的连接相关配置

[root@WebServer wordpress]# vim wp-config.php

define(‘DB_NAME’, ‘wpdb’); # 填写数据库

/** MySQL数据库用户名 */

define(‘DB_USER’, ‘wpuser’); # 填写数据库账号

/** MySQL数据库密码 */

define(‘DB_PASSWORD’, ‘wppass’); # 填写密码

/** MySQL主机 */

define(‘DB_HOST’, ‘10.10.10.4’); # 数据库所在的主机,本机也可以填写localhost

5)访问测试

有图有真相

4、建立httpd服务器(基于编译的方式进行),要求:

提供两个基于名称的虚拟主机

前期工作

建立相应目录,我一般都是放在/data,

vim /opt/apache24/conf/httpd.conf

AllowOverride none # Require all denied

(a)www1.stuX.com,页面文件目录为/web/vhosts/www1;错误日志为/var/log/httpd/www1.err,访问日志为/var/log/httpd/www1.access;

vim /opt/apache24/conf/httpd.conf

(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);

[root@lampw ~]# cd /opt/apache24/bin/

[root@lampw bin]# ./htpasswd -m -c /opt/apache24/conf/.htpasswd jerry

[root@lampw data]# vim /opt/apache24/conf/httpd.conf

5、为第4题中的第2个虚拟主机提供https服务,使得用户可以通过https安全的访问此web站点;

(1)要求使用证书认证,证书中要求使用的国家(CN)、州(HA)、城市(ZZ)和组织(MageEdu);

(2)设置部门为Ops,主机名为www2.stuX.com,邮件为admin@stuX.com;

生成私钥

生成自签证书

为CA提供所需的目录及文件

用到证书的主机生成私钥

生成证书签署请求

将请求通过可靠方式发送给CA主机,这次是在同一台机器,我就略过,如果是生产环境,估计就是要发给可信的证书签署机构

在CA主机上签署证书

ssl]# ls /etc/pki/CA/certs/httpd.crt

/etc/pki/CA/certs/httpd.crt

ssl]# cp /etc/pki/CA/certs/httpd.crt /etc/httpd24/ssl/

ssl]# ls

httpd.crt httpd.csr httpd.key

2、修改配置文件提供ssl服务

开启主配置文件的ssl调用,删除www2在httpd-vhosts中的定义

Include /etc/httpd24/extra/httpd-ssl.conf

~]# vim /etc/httpd24/extra/httpd-ssl.conf

[root@localhost httpd24]# cat extra/httpd-ssl.conf | grep -v “^#”

Listen 443

SSLPassPhraseDialog builtin

<VirtualHost 192.168.150.136:443>

DocumentRoot “/web/vhost/www2”

ServerName www2.stuX.com:443

ServerAdmin you@example.com

ErrorLog “/var/log/httpd/www2.err”

TransferLog “/usr/local/apache24/logs/access_log”

SSLEngine on

SSLCertificateFile “/etc/httpd24/ssl/httpd.crt”

SSLCertificateKeyFile “/etc/httpd24/ssl/httpd.key”

<Directory “/web/vhost/www2”>

AllowOverride None

主配置文件中启用ssl模块

~]# vim /etc/httpd24/httpd.conf

LoadModule sslmodule modules/modssl.so

重启httpd服务后测试

httpd24]# ss -tnl | grep 443

LISTEN 0 128 :::443 :::*

6、在LAMP架构中,请分别以php编译成httpd模块形式和php以fpm工作为独立守护进程的方式来支持httpd,列出详细的过程。

php编译成httpd模块形式

参阅第三题第九步

php以fpm工作为独立守护进程的方式来支持httpd

./configure –prefix=/opt/php5-fpm \ –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=/opt/php5-fpm/conf \ –with-config-file-scan-dir=/opt/php5-fpm/conf.d \ –with-bz2

添加了–enable-fpm选项 ,这是重点啊,各位记住。

make && make install

拷贝配置文件至/opt/php5-fpm/conf目录

php-5.4.26]# cp php.ini-production /etc/php.ini

拷贝php-fpm配置文件,并同时取消pid选项的注释

cp /usr/local/php5/etc/php-fpm.conf.default /usr/local/php5/etc/php-fpm.conf

php-5.4.26]# vim /usr/local/php5/etc/php-fpm.conf

pid = /usr/local/php5/var/run/php-fpm.pid

添加服务脚本

fpm]# pwd

/root/php-5.4.26/sapi/fpm

fpm]# cp init.d.php-fpm /etc/rc.d/init.d/php-fp

~]# chmod +x /etc/rc.d/init.d/php-fpm

~]# chkconfig –add php-fpm

启动php-fpm

~]# service php-fpm start

配置httpd

~]# vim /etc/httpd24/httpd.conf

启用这两个模块

LoadModule proxymodule modules/modproxy.so

LoadModule proxyfcgimodule modules/modproxyfcgi.so

添加文件类型

AddType application/x-httpd-php .php

AddType application/x-httpd-php-source .phps

添加php文件的访问通过fpm

ProxyRequests Off

ProxyPassMatch ^/(.*.php)$ fcgi://127.0.0.1:9000/usr/local/apache24/htdocs/$1

找到 DirectoryIndex index.html

改为

DirectoryIndex index.php index.html

编辑php测试页并开启httpd进行测试

php-5.4.26]# cd /usr/local/apache24/htdocs/

htdocs]# vim index.php

[root@localhost htdocs]# apachectl start

AH00558: httpd: Could not reliably determine the server’s fully qualified domain name, using localhost.

localdomain. Set the ‘ServerName’ directive globally to suppress this

[root@localhost htdocs]# ss -tnl httpd 80 php-fpm 9000

State Recv-Q Send-Q Local Address:Port Peer Address:Port

LISTEN 0 128 :::80 :::*

LISTEN 0 128 :::22 :::*

LISTEN 0 128 *:22 :

LISTEN 0 100 ::1:25 :::*

LISTEN 0 100 127.0.0.1:25 :

LISTEN 0 128 127.0.0.1:6010 :

LISTEN 0 128 ::1:6010 :::*

LISTEN 0 128 127.0.0.1:6011 :

LISTEN 0 128 ::1:6011 :::*

LISTEN 0 128 127.0.0.1:9000 :

此时的Server API为FPM/FastCGI

原创文章,作者:N24_Jerry,如若转载,请注明出处:/71551

评论列表(1条)

  • 马哥教育
    马哥教育 2017-03-29 17:31

    非常详细的文档,继续加油。

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1823388528@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班

友情链接:guoqibee.com  万达娱乐直属  万达主管  万达娱乐主管QQ  万达直属QQ  万达娱乐主管  万达招商  万达招商  guoqibee.com