编译自:
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 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 进程。如果因为某些原因新的可执行文件不能正确工作,可采用下列的其中一种方法:
发送 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)
版权信息:
本文编译自 nginx.org 的部分,遵循其原来的 licence 声明: 2-clause BSD-like license
注意:本文归作者所有,未经作者允许,不得转载