發送信號控制 nginx

編譯自:
http://nginx.org/en/docs/control.html

目錄

  • 修改配置
  • 滾動日誌文件
  • 在運行中升級可執行文件

可通過發送信號給 nginx 進行控制。nginx 主進程的 PID 默認被寫入 /usr/local/nginx/logs/nginx.pid
pid 文件的路徑被可在配置時修改,使用 pid 指令指定其他路徑。nginx 主進程支持如下信號:

TERM, INT   快速關閉 nginx
QUIT        優雅地關閉 nginx
HUP         修改配置,keeping up with a changed time zone (only for FreeBSD and Linux),
            以新配置啓動新的 worker 進程,優雅地關閉老的 worker 進程。
USR1        重新打開日誌文件
USR2        升級可執行文件
WINCH       優雅地關閉 worker 進程

也可發送信號給某個 worker 進程,支持的信號有:

TERM, INT   快速關閉 nginx
QUIT        優雅地關閉 nginx
USR1        重新打開日誌文件
WINCH       爲調試bug,非正常地關閉 worker 進程(需在配置中使用 debug_points 指令)

修改配置


要讓 nginx 重新加載配置文件,需要給 nginx 主進程發送一個 HUP 信號。nginx 主進程收到信號之後,首先檢查配置的語法,然後嘗試應用新配置,比如:打開日誌文件,或者建立新的監聽套接字。如果應用新配置失敗,nginx 對改動進行回滾,並繼續以舊的配置進行工作。如果成功,nginx 啓動新的 worker 進程,併發送關閉消息給舊的 worker 進程要求它們優雅地關閉。舊的 worker 進程關閉監聽套接字,並繼續完成當前的用戶請求,等用戶的請求完成後,就會關閉。

我們以一個例子來演示這個過程,在 Linux 中執行:
ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep '(nginx|PID)'

該命令生成如下輸出:

  PID  PPID USER     %CPU    VSZ WCHAN  COMMAND
 5638     1 root      0.0  45116 rt_sig nginx: master process nginx
 5960  5638 nginx     0.0  45356 ep_pol nginx: worker process

當發送一個 HUP 信號給 nginx 主進程
kill -s HUP 6538

執行 ps 命令,可看到 worker 進程的 PID 改變了,輸出改變爲:

 PID  PPID USER     %CPU    VSZ WCHAN  COMMAND
5638     1 root      0.0  45116 rt_sig nginx: master process nginx
6302  5638 nginx     0.0  45564 ep_pol nginx: worker process

執行 kill -s HUP 6538 的效果與重新加載 nginx 配置的命令相同:
nginx -s reload

滾動日誌


滾動日誌之前,日誌需要被重命名,然後發送 USR1 信號給 nginx 主進程。主進程 re-open 當前所有已經打開的日誌文件,並以 worker 進程當前的用戶身份,給重新打開的日誌文件定義 owner 身份(chown)。成功 re-open 之後,主進程關閉所有打開的日誌文件,併發送消息給 worker 進程要求它 re-open 日誌文件。worker 進程也會打開新的日誌文件,並立即關閉舊的日誌文件。之後,對舊的日誌文件就可以進行推送處理,
比如進行壓縮處理。

示例:

cd 到日誌目錄:

[root@lamp1 nginx]# cd /var/log/nginx
[root@lamp1 nginx]# ls
access.log  error.log

重命名 access.log 文件爲 access.log.1,執行 nginx -s reopen 命令,查看滾動日誌情況:

[root@lamp1 nginx]# mv access.log access.log.1
[root@lamp1 nginx]# nginx -s reopen
[root@lamp1 nginx]# ls
access.log  access.log.1  error.log

重命名 error.log 文件爲 error.log.1,執行 nginx -s reopen 命令,查看滾動日誌情況:

[root@lamp1 nginx]# mv error.log error.log.1
[root@lamp1 nginx]# nginx -s reopen
[root@lamp1 nginx]# ls
access.log  access.log.1  error.log  error.log.1

注:kill -s USR1 與 nginx -s reopen 效果相同。

查看日誌文件的屬主,爲 nginx,nginx 是 worker 進程的執行身份,看看前面“修改配置”小節的 ps 命令輸出:

[root@lamp1 nginx]# ll
total 12
-rw-r--r-- 1 nginx root    0 Jun 29 07:58 access.log
-rw-r--r-- 1 nginx root 4055 Jun 28 17:29 access.log.1
-rw-r--r-- 1 nginx root   63 Jun 29 07:59 error.log
-rw-r--r-- 1 nginx root 1260 Jun 29 07:58 error.log.1

在運行中升級可執行文件


爲升級 nginx 可執行程序,首先將舊的 nginx 可執行文件替換爲新的可執行文件,然後發送 USR2 信號給 nginx 主進程。nginx 主進程第一步會重命名 pid 文件,給原來的 pid 文件添加 .oldbin 後綴,比如 /usr/local/nginx/logs/nginx.pid.oldbin,然後啓動新 nginx 可執行文件並依次啓動新的 worker 進程。

  PID  PPID USER    %CPU   VSZ WCHAN  COMMAND
33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sbin/nginx
33134 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)
33135 33126 nobody   0.0  1380 kqread nginx: worker process (nginx)
33136 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)
36264 33126 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx
36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)

這時新舊 worker 進程都繼續接受請求。如果將 WIHCH 信號發送給第一個主進程,它會發送消息給它的 worker 進程,要求他們優雅地關閉,之後第一個主進程的 worker 進程開始退出:

  PID  PPID USER    %CPU   VSZ WCHAN  COMMAND
33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sbin/nginx
33135 33126 nobody   0.0  1380 kqread nginx: worker process is shutting down (nginx)
36264 33126 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx
36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)

過一會兒之後,只有新的 worker 進程繼續處理請求:

  PID  PPID USER    %CPU   VSZ WCHAN  COMMAND
33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sbin/nginx
36264 33126 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx
36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)

應注意的是,舊的主進程不會關閉它的監聽套接字,並可在需要時重新啓動它的 worker 進程。如果因爲某些原因新的可執行文件不能正確工作,可採用下列的其中一種方法:

  • 發送 HUP 信號給舊的主進程。舊的主進程會啓動新的 worker 進程,但不會重讀配置文件。之後,可發送 QUIT 信號給新主進程,讓所有新主進程的 worker 進程優雅地關閉。

  • 發送 TERM 信號給新主進程。新主進程收到 TERM 信號之後,會發送消息給它的 worker 進程,要求他們立即退出,之後這些 worker 進程將立即退出。(如果 worker 進程因爲某些原因不能立即退出,應發送 KILL 信號令其強制性地退出)當新主進程退出後,舊主進程會自動啓動新的 worker 進程。

如果新主進程退出,舊主進程會將 pid 文件的 .oldbin 後綴刪除。

如果升級成功完成,應發送 QUIT 信號關閉舊主進程,只留下新主進程:

 PID  PPID USER    %CPU   VSZ WCHAN  COMMAND
36264     1 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx
36265 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
36266 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)
36267 36264 nobody   0.0  1364 kqread nginx: worker process (nginx)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章