一、請描述一次完整的http請求處理過程;php
HTTP通訊機制是在一次完整的HTTP通訊過程當中,Web瀏覽器與Web服務器之間將完成下列7個步驟:html
創建TCP鏈接mysql
在HTTP工做開始以前,Web瀏覽器首先要經過網絡與Web服務器創建鏈接,該鏈接是經過TCP來完成的,該協議與IP協議共同構建Internet,即著名的TCP/IP協議族,所以Internet又被稱做是TCP/IP網絡。HTTP是比TCP更高層次的應用層協議,根據規則,只有低層協議創建以後才能進行更高層協議的鏈接,所以,首先要創建TCP鏈接,通常TCP鏈接的端口號是80;nginx
Web瀏覽器向Web服務器發送請求命令 c++
一旦創建了TCP鏈接,Web瀏覽器就會向Web服務器發送請求命令。例如:GET/sample/hello.jsp HTTP/1.1;web
Web瀏覽器發送請求頭信息 正則表達式
瀏覽器發送其請求命令以後,還要以頭信息的形式向Web服務器發送一些別的信息,以後瀏覽器發送了一空白行來通知服務器,它已經結束了該頭信息的發送。sql
Web服務器應答 數據庫
客戶機向服務器發出請求後,服務器會客戶機回送應答, HTTP/1.1 200 OK ,應答的第一部分是協議的版本號和應答狀態碼;
apache
Web服務器發送應答頭信息
正如客戶端會隨同請求發送關於自身的信息同樣,服務器也會隨同應答向用戶發送關於它本身的數據及被請求的文檔;
Web服務器向瀏覽器發送數據
Web服務器向瀏覽器發送頭信息後,它會發送一個空白行來表示頭信息的發送到此爲結束,接着,它就以Content-Type應答頭信息所描述的格式發送用戶所請求的實際數據;
Web服務器關閉TCP鏈接
通常狀況下,一旦Web服務器向瀏覽器發送了請求數據,它就要關閉TCP鏈接,而後若是瀏覽器或者 服務器在其頭信息加入了這行代碼:Connection:keep-alive;
TCP鏈接在發送後將仍然保持打開狀態,因而,瀏覽器能夠繼續經過相同的鏈接發送請求。保持鏈接 節省了爲每一個請求創建新鏈接所需的時間,還節約了網絡帶寬。
二、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類型的線程,當有真實請求過來的時候,將請求傳遞給服務線程,執行完畢後,又容許它釋放。這樣加強了高併發場景下的請求處理能力。
三、源碼編譯安裝LAMP環境(基於wordpress程序),並寫出詳細的安裝、配置、測試過程。
一、編譯安裝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
二、編譯安裝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進行安裝
三、編譯安裝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表明提示沒有安裝的)
如上圖提示錯誤:解決辦法以下
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');便可
四、創建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
或者在以下虛擬機配置中添加也能夠
6)修改配置文件vim /etc/httpd/httpd.conf
7)配置服務,cp /usr/local/apache/bin/apachectl /etc/init.d/httpd
重啓apache服務 service restart httpd
8)訪問結果
安全訪問
五、爲第4題中的第2個虛擬主機提供https服務,使得用戶能夠經過https安全的訪問此web站點;
(1)要求使用證書認證,證書中要求使用的國家(CN)、州(HA)、城市(ZZ)和組織(MageEdu);
(2)設置部門爲Ops,主機名爲www2.stuX.com,郵件爲admin@stuX.com;
一、生成一個自簽署證書
1)先查看有沒有安裝openssl,rpm -ql openssl
2)切換到cd /etc/pki/CA ,而後運行 (umask 0755; openssl genrsa -out private/cakey.pem 2048)
爲CA服務器創建一個本身的簽名證書
在安裝有apache服務的也安裝個CA證書,在/etc/httpd/目錄下建立ssl目錄
如上圖中,簽名後CA目錄發生變化,其中serial內容由01變成02
添加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 #定義證書文件私鑰
六、在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
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