nginx -s reload 是主进程驱动的五步优雅重载机制:校验配置、开新端口、启新worker、发quit信号、旧worker处理完请求后退出,期间新旧worker并存且内存双副本。

在容器化环境下执行 nginx -s reload 并非简单运行一条命令,关键在于让主进程能收到信号、新旧 worker 进程共存、且不中断流量——这需要容器运行时配合与配置前置保障。
确保容器内 Nginx 以 PID 1 启动并支持信号转发
默认 Docker 容器中,若用 shell 启动(如 sh -c "nginx && tail -f /dev/null"),Nginx 不是 PID 1,nginx -s reload 发送的信号会被 shell 拦截或忽略。必须满足:
- 使用
exec nginx -g "daemon off;"启动,让 Nginx 主进程直接成为 PID 1 - 避免使用
ENTRYPOINT ["/bin/sh", "-c"]包裹,改用直接二进制调用:ENTRYPOINT ["nginx", "-g", "daemon off;"] - Docker 运行时需启用信号透传(默认开启),但若用
docker-compose,确认未设置init: false
挂载配置与热重载操作路径要一致
容器内 Nginx 默认读取 /etc/nginx/nginx.conf,所有自定义配置(包括 include 的子文件)必须通过卷挂载方式注入,且路径不可写错:
- 推荐挂载整个配置目录:
-v ./conf:/etc/nginx,而非仅单个文件,避免include路径失效 - 修改配置后,进入容器执行:
nginx -t && nginx -s reload;-t必须先过,否则 reload 会失败并维持旧配置 - 若用
docker exec nginx-lab nginx -s reload,确保容器名/ID 正确,且该容器确实在运行中
验证重载是否真正平滑完成
不能只看命令返回 success,要观察进程状态和连接行为:
- 执行
docker exec nginx-lab ps aux | grep nginx,应同时看到:
–nginx: master process
– 若干nginx: worker process(新)
– 若干nginx: worker process is shutting down(旧) - 检查访问是否持续可用:在重载瞬间发起连续 curl 请求(如
while true; do curl -sI http://localhost | head -1; sleep 0.1; done),状态码应始终为 200,无 connection refused 或 timeout - 查看日志:
docker logs nginx-lab --since 1m,正常 reload 不会产生 error,仅可能有reloading configuration提示
生产环境建议加一层安全防护
容器里做 reload 更需谨慎,因为错误配置可能导致整个入口不可用:
- 每次改配置前,用
docker run --rm -v $(pwd)/conf:/etc/nginx nginx:1.21.5 nginx -t在临时容器中预检语法 - 在 CI/CD 流水线中集成配置校验步骤,通过才允许触发线上 reload
- 对关键服务,可结合健康探针 + 分批滚动:例如用
docker-compose up --scale nginx=2先扩实例,再逐个 reload,旧实例下线前确认新实例已就绪











