如何在不中断客户端活跃连接的情况下重新加载Nginx配置?
Nginx 不中断活跃连接平滑重载配置方法
先澄清一个关键误区:
systemctl reload nginx或sudo nginx -s reload本身就是平滑重载操作,不会直接断开活跃连接——旧worker进程会处理完手头的请求后再优雅退出,新worker进程会用新配置启动承接新请求。你之前遇到连接被强制断开,问题出在操作方式或配置参数上,不是命令本身的问题。修复错误操作:
你用sudo pkill -HUP nginx会把HUP信号发给所有nginx进程(包括worker),导致worker直接中断当前请求退出,这才是连接断开的根源。正确的做法是只给nginx主进程发HUP信号:sudo kill -HUP $(cat /var/run/nginx.pid)或者直接用官方推荐的重载命令:
sudo nginx -s reload调整配置确保长连接不中断:
如果你的业务涉及长连接(比如WebSocket、API长轮询),需要在nginx.conf里补充相关配置,避免重载时连接被意外断开:# 全局或server块内设置长连接超时 keepalive_timeout 65; # 允许单个长连接处理的请求数 keepalive_requests 1000; # 反向代理场景需额外配置后端keepalive upstream your_backend { server 192.168.1.10:8080; keepalive 32; # 维持与后端的空闲连接数 } server { listen 80; server_name your_domain.com; location /api { proxy_pass http://your_backend; proxy_http_version 1.1; proxy_set_header Connection ""; # 清空Connection头,复用长连接 } }替代方案(无需重载即可更新配置):
- 用OpenResty:借助Lua脚本动态加载路由或server配置,无需触发nginx重载,完全不影响现有连接。
- 灰度部署:先启动一批使用新配置的worker进程,逐步关闭旧worker,比如临时调整
worker_processes数量,通过端口转发分流请求,验证无误后再切换全量配置。
内容的提问来源于stack exchange,提问作者Roberto Nervo
相关产品推荐
相关产品推荐

