發送信號控制 nginx

發送信號控制 nginx
====================


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


目錄:
    修改配置
    滾動日誌文件
    在運行中升級可執行文件
nginx

 

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

    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 中執行:spa

ps axw -o pid,ppid,user,%cpu,vsz,wchan,command | egrep '(nginx|PID)'

該命令生成以下輸出:
      
      debug

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 配置的命令相同:
 code

nginx -s reload

 

滾動日誌
---------------

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

示例:

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 HUP 與 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 進程。
若是由於某些緣由新的可執行文件不能正確工做,可採用下列的其中一種方法:
    
    1.發送 HUP 信號給舊的主進程。舊的主進程會啓動新的 worker 進程,但不會重讀配置文件。以後,可發送 QUIT 信號給新主進程,讓全部新主進程的 worker 進程優雅地關閉。
    
    2.發送 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)
相關文章
相關標籤/搜索