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
我覺得你的mariadb用戶授權少了一步FLUSH PRIVILEGES; 有可能影響你的wp連接db。