[nginx文檔翻譯系列] 控制nginx

[nginx文檔翻譯系列] 控制nginx

原文連接:http://nginx.org/en/docs/cont...
轉自個人GitHub
有些地方以爲翻譯的不是很合理,因此在括號中寫出了原句。
若是有地方翻譯的不合理,請多多指教。html

  • 修改配置文件(Changing Configuration)nginx

  • 輪流日誌文件(Rotating Log-files)git

  • 平滑升級(Upgrading Executable on the Fly)github

能夠用信號控制nginx。主進程的ID默認狀況下被寫入/usr/local/nginx/logs/nginx.pid文件。這個名字能夠在配置時修改或者在nginx.conf文件中使用pid指令。主進程支持如下信號:服務器

TERM, INT   快速關機
QUIT        正常關機
HUP         更改配置,緊跟着一個被改變的時區(僅適用於FreeBSD和Linux) ,
            用新的配置開始一個新的工做進程,
            正常關掉舊的工做進程。
USR1        從新打開日誌文件
USR2        升級可執行文件
WINCH       工做進程正常關機

我的工做進程也可使用信號控制,儘管並非必須的。支持的信號有:post

TERM, INT    快速關機
QUIT        正常關機
USR1        從新打開日誌文件
WINCH        調試異常終止(要求debug_points 可用)

修改配置文件

爲了讓nginx重讀配置文件,一個HUP信號應該被髮送到主進程。主進程首先檢查語法的有效性,而後試圖應用新的配置,即打開日誌文件和新的監聽套接字。若是失敗,它會回滾變化的地方,並繼續使用舊的配置。若是成功了,它會開啓新的工做進程,並向舊的進程發送正常關機的消息。舊的工做進程關閉監聽的套接字並繼續服務舊的客戶端。當服務完全部的客戶端,舊的工做進程會關閉。翻譯

讓咱們經過示例來講明。假設nginx是運行在FreeBSD 4.x 上的,這個命令是:debug

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

產生如下輸出:日誌

PID    PPID USER    %CPU   VSZ WCHAN  COMMAND
33126     1 root     0.0  1148 pause  nginx: master process /usr/local/nginx/sbin/nginx
33127 33126 nobody   0.0  1380 kqread nginx: worker process (nginx)
33128 33126 nobody   0.0  1364 kqread nginx: worker process (nginx)
33129 33126 nobody   0.0  1364 kqread nginx: worker process (nginx)

若是HUP被傳達到主進程,輸出變成:

PID    PPID USER    %CPU   VSZ WCHAN  COMMAND
33126     1 root     0.0  1164 pause  nginx: master process /usr/local/nginx/sbin/nginx
33129 33126 nobody   0.0  1380 kqread nginx: worker process is shutting down (nginx)
33134 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)
33135 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)
33136 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)

舊的工做進程之中有一個ID爲333129的仍舊在工做。一段時間後退出:

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  1368 kqread nginx: worker process (nginx)
33136 33126 nobody   0.0  1368 kqread nginx: worker process (nginx)

輪流日誌文件(Rotating Log-files)

爲了輪流日誌文件,它們首先須要重命名。以後USR1信號應該被髮送到主進程。
主進程將從新打開當前全部的日誌文件,併爲它們分配工做進程正在運行下的一個非特權用戶做爲擁有者。在從新打開成功以後,主進程會關閉全部打開的文件,並向工做進程發送消息請求它們從新打開文件。工做進程也會當即打開新的文件並關閉舊的文件。所以,舊文件幾乎可當即用於post processing,好比壓縮。

平滑升級(Upgrading Executable on the Fly)

爲了平滑升級服務器,首先新的可執行文件應放置在舊文件的地方(the new executable file should be put in place of an old file first.)。在USR2信號被髮送到主進程以後。主進程首先在新文件重命名文件中的ID帶着.oldbin後綴,好比/usr/local/nginx/logs/nginx.pid.oldbin,而後啓動新的可執行文件進而輪流啓動新的工做進程:

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)

在這以後全部的工做進程(舊的和新的)都繼續接受請求。若是WINCH信號傳送到了第一個主進程,它會發送消息到它的工做進程,要求它們正常關機,而後它們將會退出:

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)

一段時間以後,只有新的工做進程會處請求:

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)

應該注意的是舊的主進程並無關閉它的監聽套接字,並且在須要的狀況下,它能夠被用來再一次啓動它的工做進程。若是處於某些緣由,新的可執行文件工做不能被接受,能夠作如下之一:

  • 發送HUP信號給舊的主進程。舊的主進程會啓動新的工做進程在沒有重讀配置文件的狀況下。以後,經過
    發送QUIT信號給新的主進程,全部新的進程均可以正常關閉。

  • 發送TERM信號給新的主進程。而後它會發送消息給它的工做進程請求它們當即退出,它們幾乎都當即退出。(若是新的進程因爲某些緣由沒有退出,應該把KILL信號發送給它們,強制他們退出。)當新的主進程退出時,舊進程會自動地啓動它新的進程。

若是新的主進程退出,舊的主進程會丟棄文件中.oldbin後綴文件名的進程ID。

若是升級成功,舊的主進程應該發送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)
相關文章
相關標籤/搜索