题 Nginx配置重新加载没有停机时间


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

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

我面临短暂的停工期。我怎么能避免这种情况?


93
2018-04-11 17:13




这些是命令行命令吗?我从来没有见过有人用这样的引号包装整个sudo命令,它可能没有必要。 - brianmearns
只是一般性评论:我认为标准/推荐的做法是为您的站点配置创建一个软/符号链接 sites-enabled,不要复制它。与您的特定问题无关,但您可能希望对此进行调查。 - brianmearns
你不应该面临停机。 kill HUP 是在nginx中进行优雅重新加载的方法。 - Jonathan Vanasco


答案:


service nginx reload 要么 /etc/init.d/nginx reload

它将在不停机的情况下对配置进行热重新加载。如果你有待处理的请求,那么会有一些延迟的nginx进程在它们死之前处理这些连接,所以这是一种非常优雅的方式来重新加载配置。

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


153
2018-04-11 17:24



这两个都应该完全符合问题所述:发送 SIGHUP 到nginx主进程。应该没有区别。 nginx.org/en/docs/control.html - Gnarfoz
当我在CentOS上发出命令时,它一直说“用法/etc/init.d/nginx(start..stop ... restart..reload)”..这就是我使用它的方式。在文件/init.d/nginx中,我找到了kill -HUP cat $PIDFILE || echo -n“无法重新加载” - mashup
你知道它们之间的区别吗? service nginx reload和 nginx -s reload?如果我运行前者,我得到这个输出: Reloading nginx configuration: nginx.,但我的更改未更新。如果我运行后者,我没有输出,但我的变化反映出来。 - Ryan Quinn
我刚刚添加了一个 log_not_found 指令,但发现我必须重新启动才能让它工作。我想重装不适用于所有指令? - mydoghasworms


/usr/sbin/nginx -s reload

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


55
2017-07-27 13:46



最后,一个在Debian Jessie中工作的命令。 - danger89
这是一种更好的方法。因为你的服务器没有 下 如果您的配置有错误(在这种情况下只显示错误)。 - Mir-Ismaili


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

按照 http://nginx.org/docs/control.html#reconfiguration发送 HUP 信号到nginx确保它执行正常重启,并且,如果配置文件不正确,整个过程将被放弃,并且你在发送之前留下了nginx HUP 信号。在任何情况下都不应该有任何停机时间。

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


8
2018-06-22 16:58





通常,重新加载服务的配置文件不应该影响正在运行的服务。但是,这取决于如何 SIGHUP 信号被处理。

如果特定服务在重新加载期间遇到停机,则可以通过优选地使用负载平衡器在多个服务器上运行相同的服务来规避这一点。在这种情况下,您可以一次取出一台服务器并重新加载/重新启动它。然后,确认确认后可以重新添加。


2
2018-04-11 17:24



虽然这并没有直接回答这个问题,但这绝对是一个最佳实践场景,OP可以明智地遵循以避免一般的停机时间。 - Andrew M.
有关nginx如何处理不同信号的详细信息: nginx.org/en/docs/control.html - Gnarfoz