平滑升级 Nginx 源码版本的核心是新旧 master 进程共存并通过 USR2、WINCH 等信号控制切换,全程不中断服务;需源码编译安装,严格复用旧版 configure 参数编译新二进制,再原子替换并按序发信号完成热切换。
平滑升级 Nginx 源码版本,核心是「新旧 master 进程共存 + 信号控制切换」,全程不 kill -9、不重启服务、不中断连接。关键不在替换文件本身,而在如何让新旧二进制协同工作。
先确保你用的是源码编译安装(dnf/yum/apt 安装的 nginx 不支持平滑升级),然后执行:
/usr/local/nginx/sbin/nginx -V,记录 configure arguments 内容,新版本必须完全一致(比如 --with-http_ssl_module --with-http_stub_status_module)cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak;cp -r /usr/local/nginx/conf /usr/local/nginx/conf.bak.$(date +%Y%m%d)
/usr/local/nginx/logs/nginx.pid,后续发信号依赖它下载新版本源码(如 nginx-1.30.4.tar.gz),解压后进入目录:
./configure [刚才记下的全部参数](例如:./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module)make(不要 make install)——编译产物在 objs/nginx
./objs/nginx -t(应显示 syntax ok)切到安装目录,执行原子替换与信号控制:
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old && cp objs/nginx /usr/local/nginx/sbin/
kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid) → 此时 ps aux | grep nginx 会看到两组进程(旧 master + 新 master)kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid) → 旧 worker 不再接受新请求,但继续处理已有长连接(如大文件下载、WebSocket)ps aux | grep 'nginx: worker process' 只剩新进程),再发 kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid.oldbin) 关闭旧 master升级后立刻检查:
curl -I http://your-domain/ | grep Server 确认版本号已更新/usr/local/nginx/sbin/nginx -t 验证配置仍有效tail -f /usr/local/nginx/logs/error.log 留意是否有 warning 或 failedmv /usr/local/nginx/sbin/nginx.old /usr/local/nginx/sbin/nginx && kill -HUP $(cat /usr/local/nginx/logs/nginx.pid.oldbin)