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)
heianyangguoheianyangguo
上一篇 2016-11-04
下一篇 2016-11-04

相关推荐

  • 磁盘分区知识总结

    Linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。 1.命令格式: df [选项] [文件] 2.命令功能: 显示指定磁盘文件的可用空间。如果没有文件名被指定,则所有当前被挂载的文件系统的可用空间将被显示。默认情况下,磁盘空间将以&nbsp…

    Linux干货 2017-08-19
  • N22期-第4周作业

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 [root@localhost ~]# cp -r /etc/skel /home/tuser1 [root@localhost ~]# chmod&nb…

    Linux干货 2016-09-05
  • 专属个人的聊天机器人的实现——图灵机器人

    先体验一下:图灵机器人智能聊天体验:http://www.tuling123.com/openapi/cloud/proexp.jsp 1、简介        本篇为大家介绍使用图灵机器人api实现聊天机器人的方法,该api本身已经拥有了智能聊天的功能,但我们可以自定义知识库的方式简单实现专属个人的聊天机器人。 2、开…

    Linux干货 2016-03-28
  • 马哥教育网络21期+第六周练习博客

    马哥教育网络21期+第六周练习博客 请详细总结vim编辑器的使用并完成以下练习题     VIM编辑器:         vi:Visual Interface 文本编辑器    &nbsp…

    Linux干货 2016-08-05
  • 网络N23期第三周cut,last,awk,tr,sort,useradd,usermod,groupadd等命令使用练习

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 [root@localhost ~]# who | cut -d '  ' -f1|uniq xinghuo root 2、取出最后登录到当前系统的用户的相关信息。 [root@localhost ~]# last -1  -a…

    Linux干货 2016-12-05
  • 文件查找:find命令、locate命令;Linux文件系统上的权限

    文件查找:find、locate locate:依赖事先构建的索引,是在系统空闲周期性自动进行;手动更新(updatedb);极其消耗资源;   find [option]… [查找路径] [查找条件] [处理动作] 查找条件: 根据文件名查找: -name “文件名称”:支持使用通配符glob(*,?,[],[…

    Linux干货 2017-12-14

评论列表(1条)

  • luoweiro
    luoweiro 2016-11-29 22:25

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