N22-第十二周作业

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

(0)
上一篇 2016-11-04 16:25
下一篇 2016-11-04 20:39

相关推荐

  • CentOS7.2编译安装httpd

    环境:CentOS7.2 软件包:httpd-2.2.29.tar.bz2 1、解压缩httpd-2.2.29.tar.bz2 2、进入解压过的文件夹,查看用法(INSTALL、)后然后./configure –help查看参数后执行需要的参数操作,     通过选项传递参数,指定启用特性,安装路径的等,…

    Linux干货 2016-08-24
  • nginx 基础笔记

    一、Nginx 优点 高性能web,可以支持反向代理 比Apache性能优越,支持更多的并发连接,但资源占用很少,轻量级的web服务器。可以支持高达50000个并发连接数的响应 Nginx 在Linux 2.6+ 使用epoll模型,提供卓越性能 做为负载均衡服务器,可以在内部直接支持PHP和Rails,也可以支持作为HTTP代理服务器对外进行服务 Ngin…

    Linux干货 2016-03-19
  • Linux学习总结及练习&day08-sed文本处理工具

    第一部分、Linux文本处理三剑客之sed(Stream EDitor)文本编辑工具     一、sed的基本功能工作原理     sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令…

    Linux干货 2016-08-10
  • Linux权限基本介绍,管理

     Linux权限机制采用UGO模式。其中 u(user)表示所属用户、g(group)表示所属组、o(other)表示除了所属用户、所属组之外的情况。 u、g、o 都有读(read)、写(write)、执行(excute) 三个权限,所以UGO模式是三类九种基本权限。         用命令 ls …

    Linux干货 2017-07-22
  • Linux系统中的防火墙iptables

    iptables/netfilter——Linux系统下的防火墙 基本原理 防火墙主要功能 工作于主机或者网络边缘,对进出本主机或本网络的报文进行匹配检测,对匹配到规则的报文进行于规则相对应的处理。 防火墙主要分类 按功能分类 主机防火墙网络防火墙 按构成分类 软件防火墙硬件防火墙 Linux防火墙软件iptables/netfilter(以后简称iptab…

    Linux干货 2017-06-13
  • sed命令使用

    一、sed简介    sed是一种在线编辑器,一次处理一行内容。处理时,把当前处理的行存储在历史缓冲区,传给“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非使用重定向存储输出。sed主要用来自动编辑一个或…

    Linux干货 2016-08-12

评论列表(1条)

  • luoweiro
    luoweiro 2016-11-29 22:25

    我觉得你的mariadb用户授权少了一步FLUSH PRIVILEGES; 有可能影响你的wp连接db。