深入探索Nginx工作原理

2022-06-29 04:18:11 字數 4386 閱讀 7060

nginx 是乙個輕量級的http 服務程式,相比其他伺服器程式如apache,nginx占用記憶體少,穩定性高,併發處理能力強。同時nginx 還是乙個反向**服務程式,和郵件**服務程式。nginx具有豐富的模組庫、靈活的配置、較低資源消耗等優點。下面,我們一起深入看一下nginx的工作機制。

我們從以下幾個方面說明以下:

資源分配技術

多核處理優化

基於上面提到技術,以及nginx很多地方的優化,讓nginx成為最快的http伺服器。

在nginx的技術架構中,程序模型是至關重要的一部分。接下來,我們一起看看nginx程序模型,以及它們的工作機制。

linux 系統中,nginx預設以守護程序daemon方式啟動,預設採用多程序方式。nginx包括兩種型別的程序:

- master 程序,數量只有乙個,管理nginx本身和worker程序

- worker 程序,數量一般和cpu核數相等,nginx的所有請求處理,均是在worker程序中完成

下面,我們分別深入看一下master和worker程序。

在nginx啟動時,master程序建立,主要負責初始化nginx和相關模組、fork worker程序、接收處理外界訊號等工作。

nginx的初始化過程:

master 程序訊號處理機制

我們通過kill命令傳送訊號給nignx master 程序,看看master程序如何處理:

root@eg001:~# ps -ef | grep nginx | grep -v grep

root

16533

10 aug28 ? 00:00:00

nginx: master process nginx

www-data 16534

16533

0 aug28 ? 00:00:47

nginx: worker process

www-data 16535

16533

0 aug28 ? 00:00:51

nginx: worker process

www-data 16536

16533

0 aug28 ? 00:00:53

nginx: worker process

www-data 16537

16533

0 aug28 ? 00:00:51

nginx: worker process

root@eg001:~# kill -hup 16533

root@eg001:~# ps -ef | grep nginx | grep -v grep

root

16533

10 aug28 ? 00:00:00

nginx: master process nginx

www-data 28194

16533

009:40 ? 00:00:00

nginx: worker process

www-data 28195

16533

009:40 ? 00:00:00

nginx: worker process

www-data 28196

16533

009:40 ? 00:00:00

nginx: worker process

www-data 28197

16533

009:40 ? 00:00:00

nginx: worker process

root@eg001:~#

注意:nginx 0.8 版本以後,提供了 -s引數,用於管理nginx服務的停止和重啟,注意line 11:

1 root@eg001:~# nginx -h

2 nginx version: nginx/1.1.19

3 usage: nginx [-?hvvtq] [-s signal] [-c filename] [-p prefix] [-g directives]45

options:

6 -?,-h : this

help

7 -v : show version and exit

8 -v : show version and configure options then exit

9 -t : test configuration and exit

10 -q : suppress non-error messages during configuration testing

11 -s signal : send signal to a master process: stop, quit, reopen, reload

12 -p prefix : set prefix path (default: /etc/nginx/)

13 -c filename : set configuration file (default: /etc/nginx/nginx.conf)

14 -g directives : set

global directives out of configuration file

worker程序負責所有請求的處理工作,我們通過乙個http請求,來梳理一下worker的工作流程:

- 新的請求到來:所有的work程序的listenfd都會變得可讀

- 竟搶互斥鎖:所有 worker 程序在註冊listenfd讀事件前,要先搶accept_mutex

- 搶到互斥鎖的worker,註冊listenfd讀事件,在事件中呼叫accept接受該連線

- 拿到請求後,worker程序開始讀取請求,解析請求,處理請求,產生資料,再返回給客戶端

- worker程序斷開連線

需要注意:乙個http請求,完全由worker程序處理,而且只在乙個worker中處理

對於每個worker 程序來說,獨立的程序,不需要加鎖,節約鎖導致的資源開銷;worker程序之間,互不干擾,平滑重啟就是很好的例子,服務不中斷。

nginx 採用的是非同步非阻塞事件處理機制,支援select/poll/epoll/kqueue 等等。nginx 同時會監控多個事件,呼叫他們是阻塞的。但是呼叫有超時時間,在超時時間內,如果有事件準備好了,就返回,否則重新放入epoll中。當讀寫返回eagain時,事件將會被再次放入epoll中。

處理執行緒只有乙個,同時處理的請求也只有乙個,所謂多請求併發,只是在不斷的切換請求而已。雖然是切換,但這種切換不涉及上下文切換,相比十分輕量。更多的併發,只是會占用更多的記憶體。

程序相關的還有,訊號和定時器,這部分另外單獨講解。

nginx是模組化架構的服務,豐富的模組,鬆散耦合,也讓nginx更加強大!我看看nginx 都有哪些模組

模組名稱

說明核心模組

實現了底層的通訊協議,為其他模組/程序構建執行環境、協作基礎,開啟listen 的埠,啟動worker程序

http/mail模組

兩個特殊模組,位於核心模組和各功能模組間;在核心模組之上實現了另一層的抽象;處理http/mail協議事件;確保呼叫功能模組順序正確。

event模組

負責監聽accept後建立的連線,對讀寫事件進行新增刪除;與非阻塞 i/o 模型結合使用;支援select/poll/epoll/kqueue等;注意驚群效應,後面有解釋。

handler模組

負責接受客戶端請求並產生輸出;通過配置檔案中location指令配置 content handler 模組。

filter模組

負責輸出內容處理,修改輸出內容;fiter模組在獲取回覆內容之後,向使用者傳送響應之前,執行處理動作;呼叫順序在編譯時就確定了。

upstream模組

實現反向**的功能,負責將請求**到後端伺服器上,並讀取響應,發回客戶端;跨越單機的限制,完成網路資料的接收、處理和**;

loadbalancer模組

根據配置指定演算法,在眾多的後端伺服器中選擇乙個,完成請求的**伺服器;都有哪些演算法呢?

驚群效應:

- 當核心 accept 乙個連線時,會喚醒所有等待中的程序

- 但實際上只有乙個程序能獲取連線,其他的程序都是被無效喚醒的

- 所以 nginx 採用了自有的一套 accept 加鎖機制,避免多個程序同時呼叫 accept

- nginx 多程序的鎖在底層預設是通過 cpu 自旋鎖來實現。如果作業系統不支援自旋鎖,就採用檔案鎖。

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的大致三種流量 web email及tcp nginx中三個狀態機 狀態機作用 nginx採用epoll非同步非阻塞事件驅動處理引擎,需要狀態機識別和處理請求,將解析出來的請求引導到靜態資源或磁碟快取 做反向 時 當靜態資源太多,記憶體不足以快取時,磁碟呼叫會退化成阻塞呼叫,所以我們使...