[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)
相关文章
相关标签/搜索