微信公众号
扫描关注微信公众号
博客大厅

如何实现 Nginx 的热部署?

原创 来源:博客站 阅读 0 今天 07:55:45 听全文

Nginx 的热部署(Hot Deployment)允许在不停止服务的情况下更新配置、证书或二进制文件,确保业务零中断。以下是 详细步骤注意事项


1. 热重载配置(最常见场景)

当修改 Nginx 配置文件(如 nginx.conf 或站点配置)后,无需重启服务,直接让 Nginx 重新加载配置:

# 检查配置语法是否正确(必须步骤)
sudo nginx -t

# 热重载配置
sudo nginx -s reload

原理

  • Master 进程检查新配置,启动新 Worker 进程。
  • 旧 Worker 进程处理完当前请求后退出,实现无缝切换。

2. 升级 Nginx 二进制文件(零停机升级)

适用于 Nginx 版本升级或添加新模块:

(1) 备份旧二进制文件

cp /usr/sbin/nginx /usr/sbin/nginx.old

(2) 替换为新二进制文件

# 假设新二进制文件已编译好
cp /path/to/new/nginx /usr/sbin/nginx

(3) 向旧 Master 进程发送信号

# 获取旧 Master 进程 PID
old_pid=$(cat /run/nginx.pid)

# 通知旧 Master 启动新 Worker,并优雅关闭旧 Worker
kill -USR2 $old_pid

# 优雅关闭旧 Master(等待所有旧 Worker 退出)
kill -QUIT $old_pid

验证

nginx -v  # 检查版本是否更新
ps aux | grep nginx  # 确认新进程已接管

3. 更新 SSL 证书(无需重启)

替换证书文件后直接热重载:

# 更新证书文件
cp new_cert.pem /etc/letsencrypt/live/example.com/fullchain.pem
cp new_key.key /etc/letsencrypt/live/example.com/privkey.pem

# 热重载配置(Nginx 会自动加载新证书)
nginx -s reload

注意:证书文件路径必须与配置中 ssl_certificatessl_certificate_key 一致。


4. 动态模块加载(Nginx 1.9.11+)

添加新模块无需重新编译主程序:

# 在 nginx.conf 中动态加载模块
load_module modules/ngx_http_brotli_filter_module.so;

操作步骤

  1. 编译模块为 .so 文件(通过 --add-dynamic-module)。
  2. .so 文件复制到 Nginx 模块目录(如 /usr/lib/nginx/modules)。
  3. 执行 nginx -s reload

5. 高级热部署技巧

(1) 双 Master 进程模式(用于二进制升级)

  • 旧 Master 和新 Master 进程短暂共存,通过 kill -USR2kill -QUIT 平滑切换。

(2) 监控 Worker 进程退出

# 查看旧 Worker 是否完全退出
tail -f /var/log/nginx/error.log | grep "worker process is exiting"

(3) 回滚机制

如果热部署失败,快速回退:

# 回滚二进制文件
mv /usr/sbin/nginx.old /usr/sbin/nginx

# 强制重启(非优雅方式,会中断请求)
sudo systemctl restart nginx

6. 完整流程示例(二进制升级)

# 1. 检查当前版本
nginx -v

# 2. 编译新版本(假设已下载源码)
cd nginx-1.25.3
./configure --prefix=/etc/nginx --with-http_ssl_module
make

# 3. 备份旧二进制
cp /usr/sbin/nginx /usr/sbin/nginx.backup

# 4. 替换二进制
cp objs/nginx /usr/sbin/nginx

# 5. 向旧 Master 发送信号
kill -USR2 $(cat /run/nginx.pid)
sleep 1
kill -QUIT $(cat /run/nginx.pid.oldbin)  # 旧 Master 退出

# 6. 验证
nginx -v
curl -I http://localhost

注意事项

  1. 语法检查
    执行 nginx -t 确保配置无误,否则 reload 会失败且保持旧配置运行。
  2. 长连接处理
    热重载时,旧 Worker 会等待活动连接完成(可通过 worker_shutdown_timeout 设置超时)。
  3. 共享内存
    使用 zone 定义的共享内存(如限流模块)在 reload 时会被保留。
  4. 信号说明
    信号 作用
    HUP 重新加载配置(同 reload
    USR2 升级二进制文件
    WINCH 优雅关闭 Worker
    QUIT 优雅退出 Master

通过以上方法,Nginx 可以实现真正的 7×24 小时不间断服务,尤其适合高可用生产环境。

学在每日,进无止境!更多精彩内容请关注微信公众号。
原文出处: 内容由AI生成仅供参考,请勿使用于商业用途。如若转载请注明原文及出处。
出处地址:http://www.07sucai.com/tech/972.html
版权声明:本文来源地址若非本站均为转载,若侵害到您的权利,请及时联系我们,我们会在第一时间进行处理。
轻松 一刻
>