nginx執行管理
master負責管理worker程式, 具體woker程式數由 worker_processes 指令配置。
Syntax: worker_processes number | auto;
Default:
worker_processes 1;
Context: main
複製程式碼
預設 worker_processes 為1,也就是說最少兩個程式一個master程式,一個worker程式。但實際工作中往往會有一個master程式管理多個woker程式。 配置 worker_processes 為auto,一般為系統的cpu核數的數量。
master程式主要用於讀取驗證配置資訊,監控、啟動、終止worker程式以及維護worker程式的個數等工作
worker主要用於接收,傳入並處理來自客戶端的連線
思考: 伺服器上不可能不存在其他服務, 也就是說程式切換是不可避免的. 為什麼 worker_process 的數字最好和cpu核數對等 往往能實現資源利用最大化。
nginx管理常用的那幾個訊號
master程式接收的訊號:
訊號名 | 含義 | 對應nginx命令列 |
---|---|---|
TERM,INT | 終止程式 | stop |
QUIT | 完成請求連結,優雅的終止程式 | quit |
HUP | 平滑重啟,重新載入配置檔案 | reload |
USR1 | 重新開啟日誌檔案,在切割日誌時用途較大 | reopen |
USR2 | 平滑升級,熱部署使用 | 無 |
WINCH | 平滑關閉程式,熱部署使用 | 無 |
worker接收的訊號
訊號名 | 含義 | 對應nginx命令列 |
---|---|---|
TERM,INT | 終止程式 | stop |
QUIT | 完成請求連結,優雅的終止程式 | quit |
WINCH | 平滑關閉程式,熱部署使用 | 無 |
例子:
為了更加直觀,我們將nginx.conf worker程式改為1
worker_processes 1;
複製程式碼
更改後,我們重新載入配置檔案,可使用
nginx -s reload
複製程式碼
或者可以使用 kill -HUP pid,pid需要你去檢視nginx master程式pid獲取. 此命令針對worker程式無效
重新生成日誌檔案
nginx -s reopen
# kill -USR1 1144
複製程式碼
停掉子程式
kill -TERM 1376
複製程式碼
我們發現master又重新啟動了一個新的worker程式.
其餘大家可以自己嘗試、瞭解
nginx -s reload 原理
程式碼級別原理目前不懂, 介紹一下簡單的自己理解吧
平滑重啟,先啟動兩個新配置的worker程式。 舊配置的worker程式繼續處理目前存在的任務,處理完後將會關閉。
reload流程:
- 向master傳送HUB訊號(reload命令)
- master程式驗證配置檔案語法是否正確
- master程式開啟新的監聽埠
- master程式用新配置啟動新的worker子程式
- master程式向向老worker程式傳送QUIT訊號
- 老worker程式關閉監聽控制程式碼,處理完當前連結後結束程式
nginx最常用的程式間通訊(共享記憶體)
因為nginx是多程式結構,如果實現比如流量控制功能、openrestry的lua_shared_dict指令,都通過共享記憶體來進行通訊.
簡單瞭解我們的nginx內部結構
我們可以下載nginx官方原始碼
wget http://nginx.org/download/nginx-1.14.2.tar.gz
複製程式碼
這個下載後的src的原始碼目錄結構
-
src/core存放著主幹部分、基礎資料結構和基礎設施的原始碼,main函式在src/core/nginx.c中,這是分析原始碼的一個很好的起點。
-
src/event存放著事件驅動模型和相關模組的原始碼。
-
src/http存放著http server和相關模組的原始碼。
-
src/mail存放著郵件代理和相關模組的原始碼。
-
src/misc存放著C++相容性測試和google perftools模組的原始碼。
-
src/os存放著依賴於作業系統實現的原始碼,nginx啟動過程中最重要的master和workers建立程式碼就在這個目錄下
我們著重觀察下 http proxy 模組
proxy 並不是一個必要的模組,它藏在了 http 下面的 modules 目錄下.
我們找到了 ngx_http_proxy_module.c 檔案, 找到 ngx_command_t,下面配置了所有的相關指令,如果官方文件不全,可以用此快速參考學習.
檔名包含filter的表示起到的為過濾功能
額外小tip
埠的限制,極限情況最多通過nginx建立當前連線數65536個
IP的埠是雙位元組,也就是256256-1, 256256對計算機來說就是0,因為此最大的埠號是65535而不是65536,當然埠數值是0-65535,數量是65536個,但0一般不用,故而我們通常都說65535,而且埠號最大也是65535,所以我們都說埠是65535
worker_connections 指令
很多人會誤解worker_connections這個引數的意思,認為這個值就是nginx所能建立連線的最大值。其實不然,這個值是表示每個worker程式所能建立連線的最大值,所以,一個nginx能建立的最大連線數,應該是worker_connections * worker_processes。當然,這裡說的是最大連線數,對於HTTP請求本地資源來說,能夠支援的最大併發數量是worker_connections * worker_processes,而如果是HTTP作為反向代理來說,最大併發數量應該是worker_connections * worker_processes/2。因為作為反向代理伺服器,每個併發會建立與客戶端的連線和與後端服務的連線,會佔用兩個連線。
更多精彩關注公眾號呀 (呆呆熊一點通)