作者:政哲俊其舒涵 | 来源:互联网 | 2023-09-11 08:23
控制nginxControllingnginx目录控制nginx修改配置文件轮转日志文件动态更新可执行文件可以通过信号控制nginx,主进程pid默认写入usrlocalnginx
控制nginx
Controlling nginx
目录
可以通过信号控制 nginx,主进程 pid 默认写入 /usr/local/nginx/logs/nginx.pid 文件。名称可能在配置时候,或是通过 nginx.conf 中 pid 指令修改。主进程支持以下信号指令:
- 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 信号给原主进程,只留新进程:
原文链接:https://www.cnblogs.com/lily-210712/p/15136758.html