Nginx 模塊化設計與詳細安裝步驟,他的多進程模型你瞭解嗎

nginx 安裝配置:

源碼編譯方式:(建議採用源碼方式安裝)

yum 方式安裝(不建議使用這種):

Nginx 目錄結構:

#不指定,默認爲 NGINX_HOME(安裝路徑)/conf/nginx.conf
./nginx -c nginx.conf
./nginx -s stop # 停止
./nginx -s quit # 退出
./nginx -s reload # 重新加載 nginx.conf

Nginx 的模塊化設計

高度模塊化的設計是 Nginx 的架構基礎。Nginx 服務器被分解爲多個模塊,每個模塊就是一個功能模塊,只負責自身的功能,模塊之間嚴格遵循“高內聚,低耦合”的原則。

核心模塊

核心模塊是 Nginx 服務器正常運行必不可少的模塊,提供錯誤日誌記錄、配置文件解析、事件驅動機制、進程管理等核心功能。

 標準 HTTP 模塊

標準 HTTP 模塊提供 HTTP 協議解析相關的功能,如:端口配置、網頁編碼設置、HTTP響應頭設置等。

 可選 HTTP 模塊

可選 HTTP 模塊主要用於擴展標準的 HTTP 功能,讓 Nginx 能處理一些特殊的服務,如:Flash 多媒體傳輸、解析 GeoIP 請求、SSL 支持等。

 郵件服務模塊

郵件服務模塊主要用於支持 Nginx 的郵件服務,包括對 POP3 協議、IMAP 協議和SMTP 協議的支持。

 第三方模塊

第三方模塊是爲了擴展 Nginx 服務器應用,完成開發者自定義功能,如:Json 支持、Lua支持等。

Nginx 多進程模型

服務器每當收到一個客戶端時。就有服務器主進程(master process)生成一個子進程(worker process)出來和客戶端建立連接進行交互,直到連接斷開,該子進程結束。

使用進程的好處是各個進程之間相互獨立,不需要加鎖,減少了使用鎖對性能造成影響,同時降低編程的複雜度,降低開發成本。其次,採用獨立的進程,可以讓進程互相之間不會影響,如果一個進程發生異常退出時,其它進程正常工作,master 進程則很快啓動新的 worker 進程,確保服務不中斷,將風險降到最低。體現了可靠性。

缺點是操作系統生成一個子進程需要進行內存複製等操作,在資源和時間上會產生一定的開銷;當有大量請求時,會導致系統性能下降

Nginx 的事件驅動

因爲Nginx是web服務器,而HTTP協議是基於TCP的,所以,Nginx的網絡事件基本上來自於TCP網絡,因爲Nginx要跨平臺,支持多個操作系統,所以,需要在不同的操作系統上支持不同的網絡模型合和事件機制。目前支持的機制如下

(1)select==>時間複雜度O(n) 在windows上

它僅僅知道了,有I/O事件發生了,卻並不知道是哪那幾個流(可能有一個,多個,甚至全部),我們只能無差別輪詢所有流,找出能讀出數據,或者寫入數據的流,對他們進行操作。所以select具有O(n)的無差別輪詢複雜度,同時處理的流越多,無差別輪詢時間就越長。

(2)poll==>時間複雜度O(n) Linux內核2.6以前,大部分UNIX

poll本質上和select沒有區別,它將用戶傳入的數組拷貝到內核空間,然後查詢每個fd對應的設備狀態, 但是它沒有最大連接數的限制,原因是它是基於鏈表來存儲的.

(3)epoll==>時間複雜度O(1) Linux內核2.6以上

epoll可以理解爲event poll,不同於忙輪詢和無差別輪詢,epoll會把哪個流發生了怎樣的I/O事件通知我們。所以我們說epoll實際上是事件驅動(每個事件關聯上fd)的,此時我們對這些流的操作都是有意義的。(複雜度降低到了O(1))

(4)eventport 在Solaris上使用

給大家在這邊留個問題,就是nginx的“驚羣”問題以及nginx是怎麼解決的?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章