Nginx 配置无需停机即可重新加载

Nginx 配置无需停机即可重新加载

我使用 nginx 作为反向代理。每当我使用以下命令更新其配置时

sudo "cp -r #{nginx_config_path}* /etc/nginx/sites-enabled/"
sudo "kill -s HUP `cat /var/run/nginx.pid`"

我遇到了短暂的宕机。我该如何避免这种情况?

答案1

运行service nginx reload/etc/init.d/nginx reload或者/usr/sbin/nginx reload

它会在不停机的情况下对配置进行热重载。如果您有待处理的请求,那么在 nginx 进程终止之前,它会处理这些连接,因此这是一种非常优雅的配置重载方式。

有时你可能想在前面加上sudo

答案2

跑步/usr/sbin/nginx -s reload

http://wiki.nginx.org/CommandLine获取更多命令行选项。

答案3

Nginx 和信号

kill您使用的方法 ( )kill -s HUP $(cat /var/run/nginx.pid是正确的。RH 或 Debian 发行版的初始化脚本最终也是使用kill命令实现的。您可以检查来自 nginx 网站的初始化示例或内容Ubuntu Nginx 软件包

nginx 可以监听多个信号(维基百科中提到):

  • TERM, INT-快速关机。
  • QUIT- 优雅关机。
  • KILL- 停止顽固的进程。
  • HUP- 重新加载配置。使用新配置启动新的工作进程。正常关闭旧的工作进程。
  • USR1- 重新打开日志文件。
  • USR2- 动态升级可执行文件。
  • WINCH- 正常关闭工作进程。

Nginx 重新加载

Nginx 重新加载(HUP信号)具体分为以下几个步骤[1,2]:

  • 主进程检查语法的有效性。
  • 应用新配置,即打开日志文件和新的监听套接字。
  • 如果失败,它会回滚更改并继续使用旧配置。
  • 如果成功,它将启动新的工作进程,并向旧的工作进程发送消息,请求它们正常关闭。
  • 旧的工作进程关闭监听套接字并继续为旧客户端提供服务。
  • 所有客户端都服务完毕后,旧的工作进程将被关闭。

我能想到的唯一一个导致您停机的原因(基于重新加载过程)是您只使用了一个工作进程(worker_processes指令),该进程设计为服务旧客户端,但已关闭监听套接字,因此您无法打开新连接。

我还建议您/usr/sbin/nginx -t在应用新配置之前始终使用验证配置文件。

深入了解 Nginx Reload

重新配置信号在文件中处理ngx_process_cycle.c我们可以看到它在函数中启动了新的工作进程ngx_start_worker_processes(...),最后它在函数中停止了旧的工作进程ngx_signal_worker_processes(...),这迭代它们NGX_SHUTDOWN_SIGNAL信号。

资源:

答案4

为了完整性,systemd执行方式如下:

systemctl reload nginx

相关内容