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注意:nginx 0.8 版本以後,提供了 -s引數,用於管理nginx服務的停止和重啟,注意line 11: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:~#
1 root@eg001:~# nginx -hworker程序負責所有請求的處理工作,我們通過乙個http請求,來梳理一下worker的工作流程: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
- 新的請求到來:所有的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非同步非阻塞事件驅動處理引擎,需要狀態機識別和處理請求,將解析出來的請求引導到靜態資源或磁碟快取 做反向 時 當靜態資源太多,記憶體不足以快取時,磁碟呼叫會退化成阻塞呼叫,所以我們使...