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

Sau*_*hah 168 nginx

我使用 nginx 作为反向代理。每当我使用它更新配置时

sudo "cp -r #{nginx_config_path}* /etc/nginx/sites-enabled/"
sudo "kill -s HUP `cat /var/run/nginx.pid`"
Run Code Online (Sandbox Code Playgroud)

我面临短暂的停机时间。我怎样才能避免这种情况?

Hen*_*jie 233

运行service nginx reload/etc/init.d/nginx reload

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

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

  • 这两个都应该完全按照问题说明:将“SIGHUP”发送到 nginx 主进程。应该没有区别。http://nginx.org/en/docs/control.html (12认同)

小智 106

/usr/sbin/nginx -s reload

有关更多命令行选项,请参阅http://wiki.nginx.org/CommandLine

  • 这是一个更好的方法。因为如果您的配置有错误,您的服务器不会*关闭*(在这种情况下仅显示错误)。 (2认同)
  • 如果 nginx 默认 pid 不在默认位置,则需要“-p”。即:` /opt/gitlab/embedded/sbin/nginx -s reload -p /var/opt/gitlab/nginx` (2认同)

cns*_*nst 11

不,您是不正确的,您不应该因您描述的程序而面临任何停机时间。(Nginx 不仅可以在没有任何停机时间的情况下即时重新加载配置,甚至可以即时升级可执行文件,仍然没有任何停机时间。)

根据http://nginx.org/docs/control.html#reconfiguration,将HUP信号发送到 nginx 确保它执行正常重启,如果配置文件不正确,则整个过程将被放弃,并且您和发送HUP信号之前一样,继续留在 nginx 中。在任何时候都不应该有任何停机时间。

为了让 nginx 重新读取配置文件,应该向主进程发送一个 HUP 信号。主进程首先检查语法有效性,然后尝试应用新的配置,即打开日志文件和新的监听套接字。如果失败,它会回滚更改并继续使用旧配置。


小智 5

为了完整systemd起见,这样做的方式:

systemctl reload nginx
Run Code Online (Sandbox Code Playgroud)


小智 5

Nginx 和信号

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

nginx 可以侦听多种信号(在 wiki 中提到):

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

Nginx 重新加载

Nginx reload( HUPsignal)具体实现为几个步骤[1,2]:

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

我能想到的唯一一个问题是您为什么会停机(基于重新加载过程)是您只使用了一个工作进程(worker_processes指令),该进程设计为为旧客户端提供服务,但已关闭侦听套接字,因此您不能打开新连接。

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

Nginx 深度重载

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

资源: