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.www58058.com/56483

(0)
heianyangguoheianyangguo
上一篇 2016-11-04
下一篇 2016-11-04

相關推薦

評論列表(1條)

  • luoweiro
    luoweiro 2016-11-29 22:25

    我覺得你的mariadb用戶授權少了一步FLUSH PRIVILEGES; 有可能影響你的wp連接db。

欧美性久久久久