一,一次完整的http連接
1,建立連接:接收或拒絕連接請求
2,接收請求:接收客戶端請求報文中對某資源的一次請求的過程
Web訪問響應模型(Web I/O)
單進程I/O模型:啓動一個進程處理用戶請求,而且一次只處理一個,多個請求被串行響應
多進程I/O模型:並行啓動多個進程,每個進程響應一個連接請求
複用I/O結構:啓動一個進程,同時響應N個連接請求
實現方法:多線程模型和事件驅動
多線程模型:一個進程生成N個線程,每線程響應一個連接請求
事件驅動:一個進程處理N個請求
複用的多進程I/O模型:啓動M個進程,每個進程響應N個連接請求,同時接收M*N個請求
3,處理請求:服務器對請求報文進行解析,並獲取請求的資源及請求方法等相關信息,根據方法,資源,首部和可選的主體部分對請求進行處理
元數據:請求報文首部
<method> <URL> <VERSION>
HEADERS 格式 name:value
<request body>
示例:
Host: www.magedu.com 請求的主機名稱
Server: Apache/2.4.7
HTTP常用請求方式,Method
GET, POST, HEAD, PUT, DELETE, TRACE, OPTIONS
4,訪問資源:
服務器獲取請求報文中請求的資源web服務器,即存放了web資源的服務器,負責向請求者提供對方請求的靜態資源,或動態運行後生成的資源
資源放置於本地文件系統特定的路徑:DocRoot
DocRoot —> /var/www/html
/var/www/html/p_w_picpaths/log.jpg
Web服務器資源路徑映射方式:
(a) docroot
(b) alias
(c) 虛擬主機docroot
(d) 用戶家目錄docroot
5,構建響應報文
一旦web服務器識別除了資源,就執行請求方法中描述的動作,並返回響應報文。響應報文中,包含有響應狀態碼、響應首部,如果生成了響應主體的話,還包括響應主體
1)響應實體:如果事務處理產生了響應主體,就將內容放在響應報文中回送過去。響應報文中通常包括:
描述了響應主體MIME類型的Content-Type首部
描述了響應主體長度的Content-Length
實際報文的主體內容
2)URL重定向:web服務構建的響應並非客戶端請求的資源,而是資源另外一個訪問路徑
永久重定向:http://www.360buy.com
臨時重定向:http://www.taobao.com
3)MIME類型:
Web服務器要負責確定響應主體的MIME類型。多種配置服務器的方法可將MIME類型與資源管理起來
魔法分類:Apache web服務器可以掃描每個資源的內容,並將其與一個已知模式表(被稱爲魔法文件)進行匹配,以決定每個文件的MIME類型。這樣做可能比較慢,但很方便,尤其是文件沒有標準擴展名時
顯式分類:可以對web服務器進行配置,使其不考慮文件的擴展名或內容,強制特定文件或目錄內容擁有某個MIME類型
類型協商:有些web服務器經過配置,可以以多種文檔格式來存儲資源。在這種情況下,可以配置web服務器,使其可以通過與用戶的協商來決定使用哪種格式(及相關的MIME類型)“最好”
6,發送響應報文
Web服務器通過連接發送數據時也會面臨與接收數據一樣的問題。服務器可能有很多條到各個客戶端的連接,有些是空閒的,有些在向服務器發送數據,還有一些在向客戶端回送響應數據。服務器要記錄連接的狀態,還要特別注意對持久連接的處理。對非持久連接而言,服務器應該在發送了整條報文之後,關閉自己這一端的連接。對持久連接來說,連接可能仍保持打開狀態,在這種情況下,服務器要正確地計算Content-Length首部,不然客戶端就無法知道響應什麼時候結束了
7,記錄日誌
最後,當事務結束時,web服務器會在日誌文件中添加一個條目,來描述憶執行的事務
二MPM工作模式
MPM:multi-processing module多路處理模塊
Prefork: 多進程I/O模型,每個進程響應一個請求,默認模型
一個主進程:生成和回收n個子進程,創建套接字,不響應請求
多個子進程:工作work進程,每個子進程處理一個請求;系統初始時,預先生成多個空閒進程,等待請求,最大不超過1024個
Worker: 複用的多進程I/O模型,多進程多線程,IIS使用此模型
一個主進程:生成m個子進程,每個子進程負責生個n個線程,每個線程響應一個請求,併發響應請求:m*n
Event: 事件驅動模型(worker模型的變種)
一個主進程:生成m個子進程,每個進程直接響應n個請求,併發響應請求:m*n,有專門的線程來管理這些keep-alive類型的線程,當有真實請求時,將請求傳遞給服務線程,執行完畢後,又允許釋放。這樣增強了高併發場景下的請求處理能力httpd-2.2:event測試版,centos6默認
httpd-2.4: event 穩定版,centos7默認
三:實現特定用戶身份驗證訪問
實現的效果如圖:
實現方法: