nginx訊號的實現

2021-07-11 05:26:13 字數 1396 閱讀 4515

1.nginx訊號結構體:

typedef struct ngx_signal_t;

當nginx收到相關的訊號的時候就會執行對應得handler

2.signals陣列,內部的每個元素都是ngx_signal_t,對應得handler為ngx_signal_handler,該陣列是一直存在的

其中比較特殊的倆個訊號:

實際上,對nginx的31號和13號訊號,sigaction將sig_ign=0x1註冊(登記)為其signal的handler。即將這兩個訊號交給系統(init程序)處理。

另:忽略sigchld訊號,常作為提高併發伺服器效能的乙個技巧。因為併發伺服器可能fork很多子程序,子程序終結後需要伺服器程序wait子程序並清理資源。如果將該訊號忽略,可使核心把殭屍子程序交給init程序處理,節省大量殭屍子程序占用的系統資源

3.sigaction結構:

4.ngx_init_signals()函式

ngx_int_t

ngx_init_signals(ngx_log_t *log)

} return ngx_ok;}

5..ngx_signal_handler()函式

該函式僅根據其收到的訊號對相應的全域性變數,如ngx_quit, ngx_terminate, ngx_noaccept等進行賦值(均賦值為1),當該程序發現相應變數為1時,即會採取相應的操作

前面講的都是訊號的初始化,下面講的是訊號如何在程序之間進行傳遞

訊號往往是給master程序傳送的,且nginx的傳送訊號會有乙個新的程序ngx_process=ngx_process_signammer=2來完成,ngx_process是乙個全域性變數

1》通過-s選項啟動nginx,只處理4種訊號,stop,quit,reopen,reload

ngx_get_option()會將reopen訊號賦值給全域性變數ngx_signal,並將ngx_process賦值為上面那個,且該命令會啟動乙個新的nginx程序,並進入main函式開始執行,並直接呼叫ngx_signal_process,

2》ngx_signal_process

讀取ngx_core_module模組的配置結構ngx_core_conf_t;

根據配置結構找到其工作程序檔案,如」/usr/local/nginx/logs/nginx.pid」(該檔案儲存nginx程序id,即pid);

開啟該檔案,讀取pid;

呼叫ngx_os_signal_process()傳送訊號

ngx_os_signal_process:

遍歷signals陣列,根據給定訊號name,找到對應signo;

呼叫kill向該pid傳送signo號訊號

kill(pid,sig->signo(訊號值))(系統呼叫)

Nginx的訊號控制

以下是自學it網 中級班上課筆記 www.zixue.it nginx的訊號控制 term,int quick shutdown quit graceful shutdown 優雅的關閉程序,即等請求結束後再關閉 hupconfiguration reloadstart the new worker...

nginx訊號控制

t erm,int quick shutdown quit graceful shutdown 優雅的關閉程序 即等請求結束後再關閉 hupconfiguration reload start the new worker processes with a new configuration gra...

Nginx控制訊號

nginx可以使用訊號來控制主程序,nginx啟動後缺省會將程序號寫入nginx.pid中。nginx主程序支援的訊號 term,int 快速關閉 quit 從容關閉 hup 過載配置 usr1 重新開啟日誌檔案 usr2 平滑公升級可執行程式 winch 從容關閉工作程序 nginx工作程序支援的...