worker工作流程圖
worker接收的信號
worker進程的工作方法:ngx_worker_process_cycle,它會關注4個全局標誌位。
1. sig_atomic_t ngx_terminate;
2. sig_atomic_t ngx_quit;
3. ngx_uint_t ngx_exiting;
4. sig_atomic_t ngx_reopen;
信號對框架的意義
信號 | 對應進程中的全局標誌變量 | 意義 |
---|---|---|
QUIT | ngx_quit | 優雅地關閉進程 |
TERM或INT | ngx_terminate | 強制關閉進程 |
USR1 | ngx_reopen | 重新打開所有文件 |
WINCH | ngx_debug_quit | 目前沒有意義 |
worker工作過程(對應上圖)
- 檢查ngx_exiting標誌位。如果收到ngx_exiting=1的信號,則準備關閉worker進程。調用正在處理連接的關閉連接函,並檢查ngx_event_timer_rbtree紅黑樹,如果不爲空,說明還有事件需要處理,繼續執行;如果爲空,調用exit_process函數,最後銷燬內存池,退出worker進程。 如果ngx_exiting=0,調用ngx_process_events_and_timers函數處理事件。
- 接着檢查ngx_terminate標誌位。如果爲1,準備退出worker進程,這裏不是“優雅”地退出,而是立即調用exit_process函數,銷燬內存池。如果爲0,則繼續向下檢查其餘標誌位。
- 然後檢查ngx_quit標誌位。如果爲1,則表示“優雅”地關閉連接。這是Nginx首先將所在進程的名字改爲“worker process is shutting down”,然後調用ngx_close_listening_sockets函數來關閉監聽端口,接着設置ngx_exiting標誌位爲1,繼續向下檢查。
- 最後檢查ngx_reopen標誌位。如果爲1,則表示需要重新打開所有文件。調用ngx_reopen_files函數重新打開所有文件。
- 進入下一次循環。