发送usr2信号是nginx平滑升级的关键第一步,用于启动新版本master和worker进程并与旧进程并存;需先替换二进制文件,再向旧master进程pid发送kill -usr2,成功后将出现新旧两个master进程且原pid文件重命名为nginx.pid.oldbin。

向 Nginx Master 进程发送 USR2 信号,是平滑升级(非重载配置)的关键第一步,目的是启动新版本 master 和 worker 进程,与旧进程并存。注意:这不是“重载配置”(那是 HUP),而是“二进制热升级”的起始动作。
确认旧 master 进程 PID
USR2 必须发给正在运行的旧版 master 进程。最可靠方式是读取 Nginx 的 pid 文件:
- 默认路径通常是
/usr/local/nginx/logs/nginx.pid或/var/run/nginx.pid - 执行:
cat /usr/local/nginx/logs/nginx.pid,输出即为当前 master 的 PID(如12345) - 若 pid 文件不存在或不准,可用:
ps aux | grep "nginx: master" | grep -v grep | awk '{print $2}'
发送 USR2 信号
使用 kill -USR2 向该 PID 发送信号:
- 命令示例:
kill -USR2 12345(将12345替换为实际 PID) - 也可直接结合读取 pid 文件写成一行:
kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid) - 成功后,旧 master 不会退出,而是 fork 出一个新 master,并启动新 worker;同时它会把原 pid 文件重命名为
nginx.pid.oldbin
验证是否生效
发送 USR2 后,应看到两个 master 进程共存:
- 执行:
ps aux | grep nginx - 预期输出中包含两行
nginx: master process:一行指向旧二进制(如/usr/local/nginx/sbin/nginx),另一行指向同一路径但已加载新二进制(内核已替换映像) - 新 worker 进程也会出现在列表中,且和旧 worker 一样监听相同端口(依赖
SO_REUSEPORT或 fork 共享 socket)
常见失败原因
如果发送 USR2 后没有新进程出现,重点排查:
-
二进制未正确替换:必须先用新编译的
nginx文件覆盖旧文件(如cp objs/nginx /usr/local/nginx/sbin/nginx) -
启动路径非绝对路径:旧 master 必须由绝对路径启动(如
/usr/local/nginx/sbin/nginx),否则 USR2 无法正确 exec 新二进制 -
权限不足:执行
kill的用户需与 master 进程所有者一致(通常是 root) - SELinux 或容器限制:在受限环境(如 OpenShift、强制 SELinux)中,可能拦截 exec 行为,需检查 audit 日志











