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工作程序支援的...