Nginx API 学习之二:控制nginx

控制nginx

Controlling nginx

可以通过信号控制 nginx,主进程 pid 默认写入 /usr/local/nginx/logs/nginx.pid 文件。名称可能在配置时候,或是通过 nginx.confpid 指令修改。主进程支持以下信号指令:

  • TERM, INT 快速关闭
  • QUIT 从容关闭
  • HUP 修改配置文件,跟上时区的变化(仅适用于FreeBSD和Linux系统),针对修改后的配置文件创建一个新的工作进程,从容关闭原工作进程
  • USR1 重新打开日志文件
  • USR2 更新可执行文件
  • WINCH 从容关闭工作进程

尽管不是必须的,独立的工作进程也可以通过信号来控制。支持的信号指令如下:

  • TERM, INT 快速关闭
  • QUIT 从容关闭
  • USR1 重新打开日志文件
  • WINCH 调试时非正常中止(需要启用debug_points

修改配置文件

为了让 nginx 重读配置文件,需要向主进程发送 HUP 信号,主进程首先检查配置文件语法有效性,然后尝试应用新配置,即打开日志文件和新的监听端口。如果失败,回滚修改继续使用旧的配置,如果成功,创建新的工作进程,发送信号到旧的工作进程,从容关闭它们,旧的进程关闭监听端口,继续服务旧客户端,服务完成,关闭旧的工作进程。

通过例子描绘以下这个过程。假设 nginx 运行在 FreeBSD,执行下面命令:

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

输出如下所示:

发送 HUP 信号到主进程,输出结果为:

PID 为 33129 的原工作进程仍然继续工作,一段时间后再退出:

轮转日志文件

为了轮转日志文件,首先需要重命名文件,然后给主进程发送 USR1 信号,之后主进程将重启所有正打开的日志文件,给这些文件分配无权限的用户作为所有者,工作进程运行在这些用户下。在重启成功后,主进程关闭所有打开的日志文件,并发送消息给工作进程重启文件,工作进程立即打开新的日志文件,关闭旧的文件。因此,旧文件几乎马上进行后续处理,例如压缩处理。

动态更新可执行文件

为了更新服务器可执行文件,需要把新文件放在旧文件位置,发送 USR2 信号到主进程,主进程先依据 进程ID 重命名原文件,加上后缀为 .oldbin,例如 /usr/local/nginx/logs/nginx.pid.oldbin,然后启动新文件,依次启动新的工作进程。

之后,所有工作进程(新的和旧的)继续接收请求,如果发送 WINCH 信号给第一个主进程,它会发送消息给对应工作进程,让它们从容关闭,然后工作进程开始退出:

一段时间之后,只留新工作进程继续处理请求:

以上会发现旧的主进程并没有关闭其监听端口,如果需要,仍然可以再次启动其工作进程。若是因为某些原因新的可执行文件执行失败,以下内容其中一条会被执行:

  • 发送 HUP 信号到原主进程,主进程将在不重读配置文件的情况下启动新的工作进程,然后发送 QUIT 信号给新的主进程来从容关闭所有新进程。
  • 发送 TERM 信号给新主进程,主进程发送消息给其工作进程让它们立即退出,工作进程几乎即刻退出(若是因为某些原因新进程未退出,应该发送 KILL 信号强制退出),当新主进程退出时,原主进程将自动启动新工作进程。

如果新主进程退出,原主进程依据 进程ID 删除后缀 .oldbin

如果成功更新,然后发送 QUIT 信号给原主进程,只留新进程:

posted @ 2021-08-13 12:01  Sunflower```  阅读(196)  评论(0)    收藏  举报