Nginx-執行管理篇

小宇渣渣渣發表於2019-02-17

nginx執行管理

Nginx-執行管理篇

圖片盜於 www.cnblogs.com/yum777/p/62…

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
複製程式碼

Nginx-執行管理篇

我們發現master又重新啟動了一個新的worker程式.

其餘大家可以自己嘗試、瞭解

nginx -s reload 原理

程式碼級別原理目前不懂, 介紹一下簡單的自己理解吧

Nginx-執行管理篇

平滑重啟,先啟動兩個新配置的worker程式。 舊配置的worker程式繼續處理目前存在的任務,處理完後將會關閉。

reload流程:

  1. 向master傳送HUB訊號(reload命令)
  2. master程式驗證配置檔案語法是否正確
  3. master程式開啟新的監聽埠
  4. master程式用新配置啟動新的worker子程式
  5. master程式向向老worker程式傳送QUIT訊號
  6. 老worker程式關閉監聽控制程式碼,處理完當前連結後結束程式

nginx最常用的程式間通訊(共享記憶體)

因為nginx是多程式結構,如果實現比如流量控制功能、openrestry的lua_shared_dict指令,都通過共享記憶體來進行通訊.

簡單瞭解我們的nginx內部結構

我們可以下載nginx官方原始碼

wget http://nginx.org/download/nginx-1.14.2.tar.gz
複製程式碼

這個下載後的src的原始碼目錄結構

Nginx-執行管理篇

  1. src/core存放著主幹部分、基礎資料結構和基礎設施的原始碼,main函式在src/core/nginx.c中,這是分析原始碼的一個很好的起點。

  2. src/event存放著事件驅動模型和相關模組的原始碼。

  3. src/http存放著http server和相關模組的原始碼。

  4. src/mail存放著郵件代理和相關模組的原始碼。

  5. src/misc存放著C++相容性測試和google perftools模組的原始碼。

  6. src/os存放著依賴於作業系統實現的原始碼,nginx啟動過程中最重要的master和workers建立程式碼就在這個目錄下

我們著重觀察下 http proxy 模組

proxy 並不是一個必要的模組,它藏在了 http 下面的 modules 目錄下.

我們找到了 ngx_http_proxy_module.c 檔案, 找到 ngx_command_t,下面配置了所有的相關指令,如果官方文件不全,可以用此快速參考學習.

Nginx-執行管理篇

檔名包含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。因為作為反向代理伺服器,每個併發會建立與客戶端的連線和與後端服務的連線,會佔用兩個連線。

更多精彩關注公眾號呀 (呆呆熊一點通)

Nginx-執行管理篇

相關文章