Web服務器php
Web服務器也稱爲WWW(WORLD WIDE WEB)服務器,主要功能是提供網上信息瀏覽服務。html
應用層使用HTTP協議。nginx
HTML文檔格式。數據庫
瀏覽器統一資源定位器(URL)。後端
Web服務器經常以B/S(Browser/Server)方式提供服務。瀏覽器和服務器的交互方式以下:瀏覽器
GET /index.php HTTP/1.1
+---------------+ +----------------+
| +-------------------> |
| Browser | | Server |
| <-------------------+ |
+---------------+ +----------------+
HTTP/1.1 200 OK
服務器
瀏覽器向服務器發出HTTP請求(Request)。架構
服務器收到瀏覽器的請求數據,通過分析處理,向瀏覽器輸出響應數據(Response)。併發
瀏覽器收到服務器的響應數據,通過分析處理,將最終結果顯示在瀏覽器中。負載均衡
Apache和Nginx都屬於Web服務器,二者都實現了HTTP 1.1協議。
Apache生命週期
"text"> +--------------------------------------------------------------+
| +---------------------+ 啓動階段 |
| | 系統啓動, 配置 | |
| +----------+----------+ |
| | |
| +----------v----------+ |
| | 模塊的初始化 | |
| +-+--------+--------+-+ |
| | | | |
| +-------------+ | +------v-------+| +--------------+ |
| | 子進程初始化 |<+ | 子進程初始化 |+>| 子進程初始化 | |
| +------+------+ +-------+------+ +-------+------+ |
+--------------------------------------------------------------+
| | | | 運行階段 |
| +----v----+ +----v----+ +----v----+ |
| | 請求循環 | | 請求循環 | | 請求循環 | |
| +----+----+ +----+----+ +----+----+ |
| | | | |
| +------v------+ +------v------+ +------v------+ |
| | 子進程結束 | | 子進程結束 | | 子進程結束 | |
| +-------------+ +-------------+ +-------------+ |
+--------------------------------------------------------------+
這個生命週期是在perfork工做下的示意,從圖中能夠看出,Apache對於每個請求都要啓動一個單獨的進程來處理。
Apache的工做模式 prefork的工做原理
一個單獨的控制進程(父進程)負責產生子進程,這些子進程用於監聽請求並做出應答。Apache老是試圖保持一些備用的 (spare)或是空閒的子進程用於迎接即將到來的請求。這樣客戶端就無需在獲得服務前等候子進程的產生。在Unix系統中,父進程一般以root身份運行以便邦定80端口,而 Apache產生的子進程一般以一個低特權的用戶運行。User和Group指令用於配置子進程的低特權用戶。運行子進程的用戶必需要對他所服務的內容有讀取的權限,可是對服務內容以外的其餘資源必須擁有儘量少的權限。
worker的工做原理
每一個進程可以擁有的線程數量是固定的。服務器會根據負載狀況增長或減小進程數量。一個單獨的控制進程(父進程)負責子進程的創建。每一個子進程可以創建ThreadsPerChild數量的服務線程和一個監聽線程,該監聽線程監聽接入請求並將其傳遞給服務線程處理和應答。Apache老是試圖維持一個備用(spare)或是空閒的服務線程池。這樣,客戶端無須等待新線程或新進程的創建便可獲得處理。在Unix中,爲了可以綁定80端口,父進程通常都是以root身份啓動,隨後,Apache以較低權限的用戶創建子進程和線程。User和Group指令用於配置Apache子進程的權限。雖然子進程必須對其提供的內容擁有讀權限,但應該儘量給予他較少的特權。另外,除非使用了suexec ,不然,這些指令配置的權限將被CGI腳本所繼承。
Apache的運行 啓動階段
+---------+
| 開始 |
+----+---+
|
+----------v------------+ 解析主配置文件http.conf中配置信息,
| 解析配置文件 | 像LoadModule, AddType
+----------+------------+ 等指令被加載至內存
|
+----------v------------+ 依據AddModule, LoadModule等指令
| 加載靜態/動態模塊 | 加載Apache模塊,像mod_php5.so被
+----------+------------+ 加載至內存,映射到Apache地址空間。
|
+----------v------------+ 日誌文件、共享內存段,數據庫連接
| 系統資源初始化 | 等初始化
+----------+------------+
|
+---v----+
| 結束 |
+--------+
運行階段
一、接受請求
二、將請求的URL映射到本地文件系統
三、檢查請求頭部
四、根據配置判斷是否能訪問所請求的資源
五、用戶認證
六、用戶權限管理(認證)
七、根據請求資源的MIME類型,選擇相應的處理函數
八、捕獲消息
九、Response,生成返回客戶端內容
十、發送後,記錄日誌
十一、清理請求遺留環境,Socket關閉
//======================================//
Nginx的模塊與工做原理
Nginx由內核和模塊組成,其中,內核的設計很是微小和簡潔,完成的工做也很是簡單,僅僅經過查找配置文件將客戶端請求映射到一個location block(location是Nginx配置中的一個指令,用於URL匹配),而在這個location中所配置的每一個指令將會啓動不一樣的模塊去完成相應的工做。
Nginx的模塊從結構上分爲核心模塊、基礎模塊和第三方模塊:
核心模塊:HTTP模塊、EVENT模塊和MAIL模塊
基礎模塊:HTTP Access模塊、HTTP FastCGI模塊、HTTP Proxy模塊和HTTP Rewrite模塊,
第三方模塊:HTTP Upstream Request Hash模塊、Notice模塊和HTTP Access Key模塊。
Nginx的模塊從功能上分爲以下三類:
Handlers(處理器模塊)。此類模塊直接處理請求,並進行輸出內容和修改headers信息等操做。Handlers處理器模塊通常只能有一個。
Filters (過濾器模塊)。此類模塊主要對其餘處理器模塊輸出的內容進行修改操做,最後由Nginx輸出。
Proxies (代理類模塊)。此類模塊是Nginx的HTTP Upstream之類的模塊,這些模塊主要與後端一些服務好比FastCGI等進行交互,實現服務代理和負載均衡等功能。
"text"> + ^
Http Request | | Http Response
| |
+---------+------v-----+ +----+----+
| Conf | Nginx Core | | FilterN |
+---------+------+-----+ +----^----+
| |
| +----+----+
| | Filter2 |
choose a handler | +----^----+
based conf | |
| +----+----+
| | Filter1 |
| +----^----+
| | Generate content
+-----v--------------------+----+
| Handler |
+-------------------------------+
Nginx架構及工做流程
上圖是Nginx的架構,這個架構相似於Apache的Worker工做狀態,Nginx的每個Worker進程都管理着大量的線程,真正處理請求的是Worker之下的線程。
全部實際上的業務處理邏輯都在worker進程。worker進程中有一個函數,執行無限循環,不斷處理收到的來自客戶端的請求,並進行處理,直到整個nginx服務被中止。Worker中這個函數執行內容以下:
操做系統提供的機制(例如epoll, kqueue等)產生相關的事件。
接收和處理這些事件,如是接受到數據,則產生更高層的request對象。
處理request的header和body。
產生響應,併發送回客戶端。
完成request的處理。
從新初始化定時器及其餘事件。
詳細請訪問原文地址 :http://www.server110.com/nginx/201402/6543.html