改完 nginx.conf,习惯性敲 service nginx restart,结果网站闪断了两秒。linux 重启nginx 看着是个小操作,直接 restart 的人不少,其实多数配置改动只需要 reload。

先测配置再动手

不管用哪种方式,先执行 nginx -t。输出 syntax is ok 和 test is successful 才继续,有错就按提示的行号改。配置文件一般在 /etc/nginx/nginx.conf,include 进来的站点文件也要一起看。配置有语法错误时 restart 会直接失败,老进程还在跑,网站看着正常,其实新配置根本没生效。

reload 是平滑,restart 是断开

systemctl reload nginx 给主进程发信号,旧 worker 处理完手头的请求再退出,新 worker 按新配置接手,连接不断。systemctl restart nginx 是整个停掉再起,几百毫秒的空窗,长连接会被掐。改 upstream、加 server 块,用 reload 就够。nginx -s quit 也是平滑退出,和 reload 的区别是一个停服务,一个换配置。

不同发行版命令不一样

CentOS 7 以上、Ubuntu 16.04 以上都用 systemctl。老系统是 service nginx reload。没装 systemd 的容器里,直接 nginx -s reload,或者 kill -HUP 主进程 PID,PID 一般在 /run/nginx.pid。Docker 环境用 docker exec 进容器执行,别在宿主机瞎重启。

重启完要确认真的起来了

systemctl status nginx 看 Active 是不是 running,再 curl -I 127.0.0.1 看返回码。端口被占用会报 Address already in use,用 ss -lntp 查 80 端口是谁。起不来就看 journalctl -u nginx -n 50 或者 error.log。linux 重启nginx 这件事,记住先 nginx -t,再 reload,出问题按日志找,顺序别乱。

线上环境尽量别用 restart,除非换了 nginx 二进制或者改了监听端口。