HTTP服務(上)
httpd是Apache超文本傳輸協議(HTTP)服務器的主程序。被設計為一個獨立運行的後臺進程,它會建立一個處理請求的子進程或線程的池。
HTTP服務的通信過程概括
服務器端
(s1) 服務器端創建新的套接字 (socket)
(s2)將套接字綁定到端口80上 (bind)
(s3)允許套接字進行連接 (listen)
(s4)等待連接 (accep)
客戶端
(c1)獲取IP地址和端口號
(c2)創建新的套接字 (socket)
(c3)連接到服務器IP:port上去 (connect)
服務器端
(s5)通知應用程序有連接到來 (read)
(s6)開始讀取請求
客戶端
(c4)連接成功
(c6)等待HTTP響應 (read)
服務器端
(s7)處理HTTP請求報文
(s8)回送HTTP響應 (write)
客戶端
(c7)處理HTTP響應
(c8)關閉連接
服務器端
(s9)關閉連接
Web響應訪問模型(Web I/O)
- 單進程I/O模型:啟動一個進程處理用戶請求,而且一次只處理一個,多個請求被串行響應
- 多進程I/O模型:並行啟動多個進程,每個進程響應一個連接請求
- 復用I/O結構 :啟動一個進程,同時響應N個連接請求,實現方法:
1)多線程模型:一個進程生成N個線程,每線程響應一個連接請求
2)事件驅動:一個進程處理N個請求 -
復用的多進程I/O模型:啟動M個進程,每個進程響應N個連接請求,同時接收M*N個請求
httpd-mpm.conf參數配置說明
多路處理模塊MPM中有三種工作模式
1、prefork
prefork是一個兩級進程模型,非線程的模式,其實通過由父進程管理創建子進程,子進程響應請求的方式來運行的。以prefork模式運行的httpd,在啟動之際就預派生fork了一些子進程,然後等待請求。每個子進程只有一個線程,在一個時間點內只能處理一個請求。
優點:成熟、穩定、兼容所有新老模塊。進程之間完全獨立,無須擔心線程安全的問題。
缺點:一個進程相對會占用更多的系統資源,消耗更多的內存。不適合處理高並發請求,因其會把請求放進隊列中,一直等到有可用進程才會處理相應的請求。
配置參數如下:
StartServers 8 #進程啟動時創建多個子進程 MinSpareServers 5 #最少空閑進程數 MaxSpareServers 20 #最大空閑進程數 Serverlimit 256 #服務器支持的最大進程數 MaxRequestsPerChild 4000 #設置的是每個子進程可處理的請求數。
2、work
worker是一個三級結構、多進程多線程的模式,其在啟動時也預先fork了幾個子進程,每個子進程能夠生產若幹個服務線程和若幹個監聽線程,每個服務線程處理一個請求,監聽線程負責接入請求並將其傳遞給服務線程處理和應答。線程比起進程會更輕量,因為線程通常會共享父進程的內存空間,因此內存的占用會減少些,在高並發的場景下表現比prefork模式好。
優點:占用內存少,高並發性能更優秀。
缺點:當一個線程出現問題的時候會導致同一進程下的線程也會出現問題。在keep-alive長連接的方式下,某個線程會被一直占用,即使中間沒有請求,也需要等待到超時才會被釋放。
配置參數如下:
StartServers 4 #服務器啟動時建立的子進程數量
MaxClients 300 #限制同一時間並發請求的數量
MinSpareThreads 25 #設置空閑線程的最小數量
MaxSpareThreads 75 #設置空閑進程的最大數量
ThreadsPerchild 25 #設置每個子進程產生的最大線程數量
MaxRequestsPerChild 0 #設置的是每個子進程可以處理的請求數
3、event
event模式是最新的運行模式,在httpd-2.4中已經是穩定可用的模式。其運行原理與worker類似,區別在於,event模式解決了在keep-alive模式下,線程被長期占用直到超時,從而導致資源浪費的問題。
在event模塊中,有一個專門的線程來管理這些keep-alive類型的線程,當接收到真實的請求時,會將請求傳遞給服務線程,執行完畢後,會將對應的服務線程釋放,這樣就能實現線程的異步非阻塞。
StartServer 3 #服務啟動時建立的子進程數量
MinSpareThreads 75 #空閑線程的最少數量
MaxSpareThreads 250 #空閑線程的最大數量
ThreadPerChild 25 #每個子進程產生 的線程數量
Maxclients 400 #最大的並發的線程數
MaxRequestsPerChild 0 #每個進程處理的最大連接數,0表示不限制
HTTP服務的基礎搭建
為了更容易的學習HTTP服務的搭建,我們用一個實例,將日誌配置,基於IP訪問控制配置,以及基於域名的虛擬主機配置等融合在一起,搭建一個簡單的httpd服務器。
實例構想:
(1) 提供兩個基於名稱的虛擬主機:
www1.lishuyang.com ,頁面文件目錄為/vhosts/www1;錯誤日誌為/var/log/httpd/www1/error_log,訪問日誌為/var/log/httpd/www1/access_log;
www2.lishuyang.com,頁面文件目錄為/vhosts/www2;錯誤日誌為/var/log/httpd/www2/error_log,訪問日誌為/var/log/httpd/www2/access_log;
(2) 通過www1.lishuyang.com訪問目錄,且要求只允許提供賬號的用戶訪問;
(3) www2不允許192.168.100.135主機訪問;
在Centos 7 基於httpd-2.4實現
1.創建相關目錄
[root@localhost ~]# mkdir -pv /vhosts/www1
[root@localhost ~]# mkdir /var/log/httpd/www1
[root@localhost www1]# mkdir -pv /vhosts/www2
[root@localhost www1]# mkdir /var/log/httpd/www2
2.配置http服務的配置文件
3.配置用戶認證文件
4. 檢查配置文件,沒問題就啟動服務
5.測試認證訪問
註: 這裏我直接將www1.lishuyang.com和www2.lishuyang.com 的ip直接寫入host文件中。
- 5.1 指定用戶訪問測試
- 5.2 測試www2中指定的ip無權訪問
非指定IP可訪問:
指定ip192.168.100.135不可訪問
HTTP服務(上)