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

HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:

  1. 建立TCP连接

    在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能进行更高层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80;

  2. Web浏览器向Web服务器发送请求命令 

    一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令。例如:GET/sample/hello.jsp HTTP/1.1;

  3. Web浏览器发送请求头信息 

    浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。

  4. Web服务器应答 

    客户机向服务器发出请求后,服务器会客户机回送应答, HTTP/1.1 200 OK ,应答的第一部分是协议的版本号和应答状态码;

  5. Web服务器发送应答头信息 

    正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档;

  6. Web服务器向浏览器发送数据

    Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据;

  7. Web服务器关闭TCP连接 

      一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者       服务器在其头信息加入了这行代码:Connection:keep-alive;

      TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接       节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

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

Apache有两种工作模型,一种是基于进程的preforker模型,一种是基于线程和进程混合的Worker模型

   1)prefork模式

prefork模式可以算是很古老但是非常稳定的Apache模式。Apache在启动之初,就预先fork一些子进程,然后等待请求进来。之所以这样做,是为了减少频繁创建和销毁进程的开销。每个子进程只有一个线程,在一个时间点内,只能处理一个请求;

优点:成熟稳定,兼容所有新老模块。同时,不需要担心线程安全的问题。(我们常用的mod_php,PHP的拓展不需要支持线程安全);

缺点:一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求,在这种场景下,它会将请求放进队列中,一直等到有可用进程,请求才会被处理。

   2)worker模式

worker模式比起上一个,是使用了多进程和多线程的混合模式。它也预先fork了几个子进程(数量比较少),然后每个子进程创建一些线程,同时包括一个监听线程。每个请求过来,会被分配到1个线程来服务。线程比起进程会更轻量,因为线程通常会共享父进程的内存空间,因此,内存的占用会减少一些。在高并发的场景下,因为比起prefork有更多的可用线程,表现会更优秀一些。

有些人会觉得奇怪,那么这里为什么不完全使用多线程呢,还要引入多进程?

原因主要是需要考虑稳定性,如果一个线程异常挂了,会导致父进程连同其他正常的子线程都挂了(它们都是同一个进程下的)。为了防止这场异常场景出现,就不能全部使用线程,使用多个进程再加多线程,如果某个线程出现异常,受影响的只是Apache的一部分服务,而不是整个服务。

优点:占据更少的内存,高并发下表现更优秀。

缺点:必须考虑线程安全的问题,因为多个子线程是共享父进程的内存地址的。如果使用keep-alive的长连接方式,某个线程会一直被占据,也许中间几乎没有请求,需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。

    3)EVENT模式

这个是Apache中最新的模式,在现在版本里的已经是稳定可用的模式。它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)。event

MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力。


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

1、编译安装httpd-2.4.9

1)编译安装apr-1.5.0.tar.bz2

]# tar xvjf apr-1.5.0.tar.bz2

]# cd apr-1.5.0

]# ./configure --prefix=/usr/local/apr

]# make && make install

2)编译安装apr-util-1.5.2.tar.bz2

]# tar xjf apr-util-1.5.2.tar.bz2

]# cd apr-util-1.5.2

]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/

]# make && make install

3)编译安装pcre-8.38.tar.gz

]# tar xzf pcre-8.38.tar.gz

]# cd pcre-8.38

]# ./configure --prefix=/usr/local/pcre

]# make && make install

4)创建系统组和用户

#] groupadd -r apache

#] useradd -r -g apache apache

编译安装httpd

]# tar xjf httpd-2.4.9.tar.bz2

]# cd httpd-2.4.9

]# ./configure --prefix=/usr/local/apache \

> --sysconfdir=/etc/httpd \    # 指定配置文件路径

> --enable-so \    # 支持动态加载DSO模块

> --enable-ssl \    # 开启SSL功能,支持https

> --enable-cgi \    # 启用与外部应用程序的cgi接口功能

> --enable-rewrite \    # 支持url重写

> --with-zlib \    # 支持web页面压缩传送

> --with-pcre=/usr/local/pcre \    # 增强型的正则表达式分析工具,nginx等程序依赖,依赖于pcre-devel开发包

> --with-apr=/usr/local/apr \    # 指定高版本apr程序路径,不指定则会自动指定系统默认版本

> --with-apr-util=/usr/local/apr-util \    # 指定apr-util路径

> --enable-mpms-shared=all \    # 支持动态装卸载所有mpm

> --with-mpm=prefork \    # mpm默认使用prefork

> --enable-modules=all    # all为安装所有模块,most为安装常用模块(安装不代表启用)

]# make && make install


2、编译安装mysql

1)添加组  ,添加用户

[root@www mysql]# groupadd -r -g 306 mysql

[root@www mysql]# useradd -g 306 -r -u 306 mysql

[root@www mysql]# chown -R mysql.mysql /usr/local/mysql/*     #更改mysql目录下的属组和属主

创建用户存储数据库的目录mkdir /mydata/data -pv

更改目录的属组和属主 ]# chown -R mysql.mysql /mydata/data/

2)解压]# tar xzf mysql-5.6.13.tar.gz

3)安装编译代码所需要的包]# yum -y install make gcc-c++ cmake bison-devel ncurses-devel libaio        

4)编译  ]#  cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql  \              [MySQL安装的根目录]

-DMYSQL_DATADIR=/mydata/mysql/data  \                       [MySQL数据库文件存放目录]

-DSYSCONFDIR=/etc \                                                          [MySQL配置文件所在目录]

-DMYSQL_USER=mysql \                                                      [MySQL用户名]      

-DWITH_MYISAM_STORAGE_ENGINE=1 \                            [MySQL的数据库引擎]

-DWITH_INNOBASE_STORAGE_ENGINE=1 \                         [MySQL的数据库引擎]

-DWITH_ARCHIVE_STORAGE_ENGINE=1 \                            [MySQL的数据库引擎]

-DWITH_MEMORY_STORAGE_ENGINE=1 \                           [MySQL的数据库引擎]

-DWITH_READLINE=1 \                                                          [MySQL的readline library]

-DMYSQL_UNIX_ADDR=/var/run/mysql/mysql.sock \           [MySQL的通讯目录]

5)然后    #] make && make install进行安装

3、编译安装php

1)#] tar xjf php-5.4.26.tar.bz2   解压

2)配置 #] cd php-5.4.26

[root@www php-5.4.26]# ./configure --enable-opcache --prefix=/etc/local/php \

> --with-config-file-path=/usr/local/php/etc \

> --with-mysql=/usr/local/mysql \

> --with-mysqli=/usr/local/mysql/bin/mysql_config \

> --enable-mbstring=all \

> --with-pdo-mysql \

> --enable-sockets \

> --enable-mbstring \

> --enable-fpm \

> --with-curl \

> --with-iconv-dir=/usr/local \

> --with-freetype-dir \

> --with-jpeg-dir \

> --with-png-dir \

> --with-zlib \

> --enable-xml \

> --with-gd \

> --with-libxml-dir=/usr \

> --with-openssl \

> --with-iconv

我这里编译报错libxml2没有找到,可以使用yum install libxml2-devel -y 即可解决,

一般报错某某包没有找到,就使用yum install xxx.devel -y安装即可(xxx代表提示没有安装的)

linux第九周微职位_微职位

如上图提示错误:解决办法如下

centos32位系统:

yum install libjpeg libpng freetype libjpeg-devel libpng-devel freetype-devel -y
若是64位系统
解决方法:

yum install libjpeg.x86_64 libpng.x86_64 freetype.x86_64 libjpeg-devel.x86_64 libpng-devel.x86_64 freetype-devel.x86_64 -y

执行make && make install 即可


#] scripts/mysql_install_db--user=mysql--datadir=/mydata/data/(初始化mysql)

chown -R root /usr/local/mysql/*(万一有人攻破mysql进程,则不安全,所以改为root用户)

但要注意实际data目录要mysql.mysql。现在data目录我们设为/mydata/data,所以此目录里的所属用户为root也没事儿,不影响。ls/etc/init.d/(无mysqld)

cp support-files/mysql.server /etc/init.d/mysqld

ll/etc/init.d/mysqld

chkconfig--addmysqld(为系统增加mysql服务)chkconfig--listmysqld(看看默认是否会启用,3,4,5是“on”状态即可)


下面添加mysql配置文件:

安装包给我们提供的也有配置文件,也在support-files下

mv/etc/my.cnf/etc/my.cnf.bak将原来的配置文件重命名(让它不起作用)

service mysqld start

netstat-tnlp

发现3306已启动

ls/usr/local/mysql/bin/发现客户端已安装

vim/etc/profile.d/mysql.sh

写入:export PATH=$PATH:/usr/local/mysql/bin

注销root重新登录

mysql(即可进入mysql)\q退出mysql。

为保证在一定条件能正确使用mysql库文件,就要将mysql库文件输出。将mysql库文件输出的方法如下:

vim /etc/ld.so.conf.d/mysql.conf添加如下内容

/usr/local/mysql/lib

ldconfig -v使其生效

同时应将mysql的include也在/usr/include/下做个链接,确保完美运行。方法如下:

ln -sv /usr/local/mysql/include /usr/include/mysql

ls /usr/include/mysql/


补充个小知识:

CentOS系统中那么忘记了mysql的登录密码,怎么办?使用安全模式吧.

首先需要在CentOS系统中停止mysql:

#service mysqld stop
#/usr/local/mysql/bin/mysqld_safe --skip-grant-tables &

下面在CentOS系统继续输入:
msql> mysql -u root -p

下面的密码直接键入回车即可.

下面既是在CentOS系统重新设置密码: 
mysql> update mysql.user set password=password("新密码") where user="root";

刷新权限 
mysql>flush privileges;

退出 
mysql>exit;

启动mysql,继续以往的登录动作即可. 
# /rc.d/init.d/mysqld start 

重启如果提示:

2017-08-27T14:33:49.450752Z 0 [ERROR] InnoDB: Unable to lock ./ibdata1, error: 11

需要使用 ]# ps aux |grep mysql* 查看有没有mysqld_safe相关的进程,有就使用kill -9 进程号

# mysql -u root -p

进去mysql里面如果提示密码简单,那就在myslq命令行重新设置下密码>SET PASSWORD=PASSWORD('123456');即可



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)编译安装apr-1.5.0.tar.bz2

]# tar xvjf apr-1.5.0.tar.bz2

]# cd apr-1.5.0

]# ./configure --prefix=/usr/local/apr

]# make && make install

2)编译安装apr-util-1.5.2.tar.bz2

]# tar xjf apr-util-1.5.2.tar.bz2

]# cd apr-util-1.5.2

]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/

]# make && make install

3)编译安装pcre-8.38.tar.gz

]# tar xzf pcre-8.38.tar.gz

]# cd pcre-8.38

]# ./configure --prefix=/usr/local/pcre

]# make && make install

4)创建系统组和用户

#] groupadd -r apache

#] useradd -r -g apache apache

编译安装httpd

]# tar xjf httpd-2.4.9.tar.bz2

]# cd httpd-2.4.9

]# ./configure --prefix=/usr/local/apache \

> --sysconfdir=/etc/httpd \    # 指定配置文件路径

> --enable-so \    # 支持动态加载DSO模块

> --enable-ssl \    # 开启SSL功能,支持https

> --enable-cgi \    # 启用与外部应用程序的cgi接口功能

> --enable-rewrite \    # 支持url重写

> --with-zlib \    # 支持web页面压缩传送

> --with-pcre=/usr/local/pcre \    # 增强型的正则表达式分析工具,nginx等程序依赖,依赖于pcre-devel开发包

> --with-apr=/usr/local/apr \    # 指定高版本apr程序路径,不指定则会自动指定系统默认版本

> --with-apr-util=/usr/local/apr-util \    # 指定apr-util路径

> --enable-mpms-shared=all \    # 支持动态装卸载所有mpm

> --with-mpm=prefork \    # mpm默认使用prefork

> --enable-modules=all    # all为安装所有模块,most为安装常用模块(安装不代表启用)

]# make && make install

5)配置虚拟主机

我们需要对www1.stuX.com的状态信息网页进行用户访问控制:

创建虚拟用户]# htpasswd -c -m /etc/httpd/conf.d/.htpasswd status(status用户)

查看编译有没有状态信息模块:

]# ls /usr/local/apache/modules/ |grep mod_status

我们需要在网页查看apache的状态信息,apache状态信息模块是默认开启的

]# vim /etc/httpd24/httpd.conf

LoadModule status_modulemodules/mod_status.so

linux第九周微职位_第九周_02

或者在如下虚拟机配置中添加也可以

linux第九周微职位_微职位_03

6)修改配置文件vim /etc/httpd/httpd.conf 

linux第九周微职位_第九周_04

7)配置服务,cp /usr/local/apache/bin/apachectl /etc/init.d/httpd

重启apache服务 service restart httpd

8)访问结果

linux第九周微职位_第九周_05

linux第九周微职位_第九周_06


安全访问


linux第九周微职位_微职位_07

linux第九周微职位_linux_08

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

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

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

1、生成一个自签署证书

1)先查看有没有安装openssl,rpm -ql openssl

2)切换到cd /etc/pki/CA     ,然后运行 (umask 0755; openssl genrsa -out private/cakey.pem 2048)

linux第九周微职位_第九周_09

为CA服务器建立一个自己的签名证书

linux第九周微职位_第九周_10

在安装有apache服务的也安装个CA证书,在/etc/httpd/目录下创建ssl目录

linux第九周微职位_微职位_11然后在CA服务器上把客户端的发送过来的证书进行签名

linux第九周微职位_微职位_12

linux第九周微职位_第九周_13如上图中,签名后CA目录发生变化,其中serial内容由01变成02


linux第九周微职位_微职位_14linux第九周微职位_微职位_15linux第九周微职位_第九周_16

添加httpd中ssl配置

]# vim /etc/httpd/conf.d/httpd_ssl.conf         #编辑ssl配置文件

LoadModule ssl_module modules/mod_ssl.so        #添加需要加载的模块

LoadModule socache_shmcb_module modules/mod_socache_shmcb.so

ServerName www2.stuX.com

DocumentRoot "/vhosts/www2.stuX.com"

<Directory "/vhosts/www2.stuX.com">

    <RequireAll>

        Require all granted

    </RequireAll>

</Directory>

SSLCertificateFile "/etc/httpd/ssl/httpd.crt"        #定义证书文件路径

SSLCertificateKeyFile /etc/httpd/ssl/httpd.key        #定义证书文件私钥


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

1.编译安装php

1)#] tar xjf php-5.4.26.tar.bz2   解压

2)配置 #] cd php-5.4.26

[root@www php-5.4.26]# ./configure --enable-opcache --prefix=/etc/local/php \

> --with-config-file-path=/usr/local/php/etc \

> --with-mysql=/usr/local/mysql \

> --with-mysqli=/usr/local/mysql/bin/mysql_config \

> --enable-mbstring=all \

> --with-pdo-mysql \

> --enable-sockets \

> --enable-mbstring \

> --enable-fpm \

> --with-curl \

> --with-iconv-dir=/usr/local \

> --with-freetype-dir \

> --with-jpeg-dir \

> --with-png-dir \

> --with-zlib \

> --enable-xml \

> --with-gd \

> --with-libxml-dir=/usr \

> --with-openssl \

> --with-iconv

我这里编译报错libxml2没有找到,可以使用yum install libxml2-devel -y 即可解决,

一般报错某某包没有找到,就使用yum install xxx.devel -y安装即可(xxx代表提示没有安装的)

]# make && make install


[root@localhost php-5.4.26]# cp /opt/php-5.4.26/php.ini-development /etc/local/php/etc/php.ini

[root@localhost php-5.4.26]# cd /etc/local/php/etc/

[root@localhost etc]# ls

pear.conf  php-fpm.conf.default  php.ini

[root@localhost etc]# cp php-fpm.conf.default php-fpm.conf

]# vim /etc/httpd/httpd.conf    #编辑配置文件,添加下面三行使httpd支持php

DirectoryIndex index.php index.html

AddType application/x-httpd-php .php

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

linux第九周微职位_微职位_17

2.php编译fpm模式

]#./configure –prefix=/usr/local/php5 –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=/etc 

–with-config-file-scan-dir=/etc/php.d –with-bz2

]# make && make install

]# cp php.ini-production /etc/php.ini    #拷贝配置文件至/etc目录

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

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

pid = /usr/local/php5/var/run/php-fpm.pid    #取消pid选项的注释

]# 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

]# service php-fpm start    #启动php-fpm

]# vim /etc/httpd/httpd.conf 

LoadModule proxy_module modules/mod_proxy.so        #启用这两个模块

LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

AddType application/x-httpd-php .php            #添加文件类型

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

ProxyRequests Off                        #添加php文件的访问通过fpm

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