零中断升级的核心是配置重载与二进制升级彻底分离:配置变更用 nginx -s reload,版本/模块/依赖变更必须严格按 USR2→WINCH→QUIT 三步完成二进制平滑升级。
版本升级时保障零中断,核心不是“优化参数”,而是把配置重载和二进制升级彻底分开——配置变更走 nginx -s reload,版本/模块/依赖变更必须走 USR2 + WINCH + QUIT 二进制平滑升级流程。两者混用或跳步,极易引发 worker 崩溃、连接重置或 502 抖动。
很多中断其实源于误判:
这是成败前提,跳过就大概率卡在 USR2 阶段:
nginx -V,完整复制所有 configure 参数,包括 --prefix、--conf-path、--with-http_ssl_module 等每一个 --with-xxx;./configure [原参数] && make,严禁 make install;objs/nginx -t -c /usr/local/nginx/conf/nginx.conf 必须通过;/usr/local/nginx/sbin/nginx),非 systemd 托管——systemd 会拦截 USR2 信号。三步缺一不可,且 PID 文件名和目标进程必须精准对应:
kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid),启动新 master + 新 worker;此时 ps aux | grep nginx 应显示两组进程;nginx.pid.oldbin(不是 .pid)发送 kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid.oldbin),仅关停旧 worker,不碰旧 master;nginx.pid.oldbin 发 kill -QUIT 关闭旧 master。即使走对了升级流程,配置文件写法错误也会导致 reload 失败回退或半截生效:
nginx.conf;先写入临时文件,如 nginx.conf.new;mv nginx.conf.new nginx.conf 替换——这是原子 rename 系统调用,不可能被中断;nginx -t,校验失败则旧配置继续运行,不会中断服务。不复杂但容易忽略