Nginx配置重新加载而无需停机


122

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

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

我面临短暂的停机时间。我该如何避免呢?


1
这些是命令行命令吗?我从未见过有人将整个sudo命令用这样的引号引起来,这可能不是必需的。
brianmearns's

4
只是一个一般性的评论:我认为标准/建议做法是在sites-enabled而不是将其复制的情况下为您的站点配置创建一个软/符号链接。与您的特定问题无关,但是您可能需要调查一下。
brianmearns's

1
您不应该面临停机时间。kill HUP是在nginx中进行正常重载的方法。
乔纳森·瓦纳斯科

Answers:


181

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

它将热重载配置而不会造成停机。如果您有待处理的请求,那么会有一些缠绵的nginx进程在它们死之前处理这些连接,因此这是重新加载配置的极其优雅的方式。

有时您可能想加上 sudo


10
两者都应该完全按照问题所指出的去做:发送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

1
您知道service nginx reload和之间有什么区别nginx -s reload吗?如果运行前者,Reloading nginx configuration: nginx.则会得到以下输出:,但是我的更改不会更新。如果运行后者,则不会获得任何输出,但是会反映出我的更改。
Ryan Quinn

我只是在添加log_not_found指令后尝试了此操作,但发现实际上必须重新启动才能使其工作。我想重新加载对所有指令都无效吗?
mydoghasworms

81

/usr/sbin/nginx -s reload

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


最后,一个在Debian Jessie中有效的命令。
危险89年

1
这是一个更好的方法。因为如果您的配置有错误(在这种情况下仅显示错误),服务器不会关闭
Mir-Ismaili

如果nginx default pid不在默认位置,则需要'-p'。即:`/ opt / gitlab / embedded / sbin / nginx -s reload -p / var / opt / gitlab / nginx`
qxo

9

不,您不正确,您所描述的过程不应该导致任何停机。(Nginx不仅可以在不停机的情况下即时重新加载配置,甚至可以在不停机的情况下即时升级可执行文件。)

根据http://nginx.org/docs/control.html#reconfiguration,向HUPnginx 发送信号可确保它执行正常重启,并且,如果配置文件不正确,则整个过程将被放弃,您将与发送HUP信号之前一样,与nginx一起保留。任何时候都绝不能停机。

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


2

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

如果特定服务在重新加载过程中出现停机时间,则可以通过在多个服务器上运行相同服务(最好使用负载平衡器)来避免这种情况。在这种情况下,您可以一次取出一台服务器,然后重新加载/重新启动它。然后,可以在确认确定后将其重新添加。


尽管这不能直接回答问题,但这绝对是最佳实践方案,OP会明智地遵循这种方案来避免一般的停机时间。
Andrew M.

1
有关nginx如何处理不同信号的详细信息:nginx.org/en/docs/control.html
Gnarfoz,2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.