Nginx的工作原理

2022-03-14 16:03:18 字數 2245 閱讀 3404

nginx 工作原理

nginx由核心和模組組成。

nginx本身做的工作實際很少,當它接到乙個http請求時,它僅僅是通過查詢配置檔案將此次請求對映到乙個location block,而此location中所配置的各個指令則會啟動不同的模組去完成工作,因此模組可以看做nginx真正的勞動工作者。通常乙個location中的指令會涉及乙個handler模組和多個filter模組(當然,多個location可以復用同乙個模組)。handler模組負責處理請求,完成響應內容的生成,而filter模組對響應內容進行處理。

使用者根據自己的需要開發的模組都屬於第三方模組。正是有了這麼多模組的支撐,nginx的功能才會如此強大。

nginx的模組從結構上分為核心模組、基礎模組和第三方模組:

nginx的模組從功能上分為如下三類:

nginx程序模型

nginx預設採用多程序工作方式,nginx啟動後,會執行乙個master程序和多個worker程序。其中master充當整個程序組與使用者的互動介面,同時對程序進行監護,管理worker程序來實現重啟服務、平滑公升級、更換日誌檔案、配置檔案實時生效等功能。worker用來處理基本的網路事件,worker之間是平等的,他們共同競爭來處理來自客戶端的請求。

nginx的程序模型如圖所示:

在建立master程序時,先建立需要監聽的socket(listenfd),然後從master程序中fork()出多個worker程序,如此一來每個worker程序多可以監聽使用者請求的socket。一般來說,當乙個連線進來後,所有在worker都會收到通知,但是只有乙個程序可以接受這個連線請求,其它的都失敗,這是所謂的驚群現象。nginx提供了乙個accept_mutex(互斥鎖),有了這把鎖之後,同一時刻,就只會有乙個程序在accpet連線,這樣就不會有驚群問題了。

先開啟accept_mutex選項,只有獲得了accept_mutex的程序才會去新增accept事件。nginx使用乙個叫ngx_accept_disabled的變數來控制是否去競爭accept_mutex鎖。ngx_accept_disabled = nginx單程序的所有連線總數 / 8 -空閒連線數量,當ngx_accept_disabled大於0時,不會去嘗試獲取accept_mutex鎖,ngx_accept_disable越大,於是讓出的機會就越多,這樣其它程序獲取鎖的機會也就越大。不去accept,每個worker程序的連線數就控制下來了,其它程序的連線池就會得到利用,這樣,nginx就控制了多程序間連線的平衡。

每個worker程序都有乙個獨立的連線池,連線池的大小是worker_connections。這裡的連線池裡面儲存的其實不是真實的連線,它只是乙個worker_connections大小的乙個ngx_connection_t結構的陣列。並且,nginx會通過乙個鍊錶free_connections來儲存所有的空閒ngx_connection_t,每次獲取乙個連線時,就從空閒連線鍊錶中獲取乙個,用完後,再放回空閒連線鍊錶裡面。乙個nginx能建立的最大連線數,應該是worker_connections * worker_processes。當然,這裡說的是最大連線數,對於http請求本地資源來說,能夠支援的最大併發數量是worker_connections * worker_processes,而如果是http作為反向**來說,最大併發數量應該是worker_connections * worker_processes/2。因為作為反向**伺服器,每個併發會建立與客戶端的連線和與後端服務的連線,會占用兩個連線。

nginx處理http請求流程

http請求是典型的請求-響應型別的的網路協議。http是檔案協議,所以我們在分析請求行與請求頭,以及輸出響應行與響應頭,往往是一行一行的進行處理。通常在乙個連線建立好後,讀取一行資料,分析出請求行中包含的method、uri、http_version資訊。然後再一行一行處理請求頭,並根據請求method與請求頭的資訊來決定是否有請求體以及請求體的長度,然後再去讀取請求體。得到請求後,我們處理請求產生需要輸出的資料,然後再生成響應行,響應頭以及響應體。在將響應傳送給客戶端之後,乙個完整的請求就處理完了。

處理流程圖:

Nginx工作原理

nginx web伺服器主要是由各種模組協同工作,模組從結構上分為核心模組,基礎模 塊和第三方模組,其中三類模組分別如下 1 核心模組 http模組 event模組和mail模組等 2 基礎模組 http access模組 http fastcgi模組 http proxy模組和http rewri...

Nginx工作原理

nginx engine x 是乙個高效能http 反向 imap pop3 smtp伺服器 nginx web伺服器主要是由各種模組協同工作 從結構上分為 核心模組 http模組 event模組和mail模組等 基礎模組 http access模組 http fastcgi模組 http prox...

Nginx 模組的工作原理

nginx 模組的工作原理 handlers 處理器模組 此模組直接處理請求 並且進行內容傳輸以及修改headres資訊等操作。handlers模組只能處理乙個。filters 處理器模組 此類模組只需要對其他伺服器模組輸出的內容進行修改操做,最後又nginx操做 proxies 模組 此模組是ng...