我将nginx用作反向代理。
每当使用

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


更新其配置时,我都会遇到短暂的停机。如何避免这种情况?

评论

这些是命令行命令吗?我从未见过有人将整个sudo命令用这样的引号引起来,这可能没有必要。

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

您不应该面临停机时间。 kill HUP是在Nginx中进行正常重载的方法。

#1 楼

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

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

有时您可能希望先添加sudo

评论


两者都应该完全按照问题所述进行:将SIGHUP发送到nginx主进程。不应有任何区别。 nginx.org/en/docs/control.html

–纳尔福斯
2012年7月27日在12:36

当我在CentOS上发出命令时,它总是说“使用/etc/init.d/nginx(start..stop ... restart..reload)” ..正是我的用法。在文件/init.d/nginx中,我找到了kill -HUP cat $ PIDFILE || echo -n“无法重新加载”

– mashup
15年4月13日在18:21



你知道服务nginx reload和nginx -s reload有什么区别吗?如果运行前者,则会得到以下输出:重新加载nginx配置:nginx。,但我的更改未更新。如果运行后者,则不会获得任何输出,但是会反映出我的更改。

–瑞安·奎因(Ryan Quinn)
17年4月21日在3:46

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

–mydoghasworms
17年6月22日在12:24

我这样做会导致停机。例如,我收到像502错误网关之类的消息,这正在杀死一些请求。我正在运行Nginx的旧版本-不确定这是否是原因

–马克
20年8月5日在14:48

#2 楼

运行/usr/sbin/nginx -s reload

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

评论


最后,一个在Debian Jessie中有效的命令。

–danger89
17-6-30上午11:49



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

–伊斯梅里先生
18年9月19日在14:51

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

– qxo
19年1月9日在1:59

#3 楼

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

根据http://nginx.org/ docs / control.html#reconfiguration,将HUP信号发送到nginx可以确保它执行正常重启,并且,如果配置文件不正确,则整个过程都将被放弃,并且像发送前一样,您会被nginx HUP信号。



任何时候都不可能出现停机。


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


#4 楼

为了完整起见,请执行以下操作:

systemctl reload nginx


#5 楼

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

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

评论


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

–安德鲁(Andrew M.)
2012年4月11日17:29



有关nginx如何处理不同信号的详细信息:nginx.org/en/docs/control.html

–纳尔福斯
2012年7月27日在12:37

#6 楼

Nginx和Signals

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

有多种信号,nginx可以收听(在Wiki中提到):



TERMINT-快速关闭。

QUIT-正常关闭。

KILL-停止顽固的进程。

HUP-配置重新加载。使用新配置启动新的工作进程。正常关闭旧工作进程。

USR1-重新打开日志文件。

USR2-即时升级可执行文件。

WINCH-正常关闭

Nginx重载

Nginx重载(HUP信号)更具体地通过几个步骤[1,2]实现:


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

我只能想到一个问题,为什么停机(基于重载过程)是因为您只使用了一个工作进程(worker_processes指令),该进程本来是为老客户服务的,关闭了监听套接字,因此您无法打开新连接。

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

Nginx重新加载深度

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

资源:


[1] https://nginx.org/en/docs/control.html

[2] https://www.nginx.com / resources / wiki / start / topics / tutorials / commandline /#stopping-or-restarting-nginx



评论


因此,这意味着“ nginx -s reload”不会重新启动nginx服务(即导致新的pid),而只是指示nginx服务重新加载其配置而不重新启动吗?如果我有一个docker容器,其中使用“ nginx -g'daemon off;”将其连接到nginx进程; “进行重新加载不会杀死我的容器吗?

– Crine
20年7月10日在18:51

@Crine不,它不会杀死您的容器。

–Lirt
20年7月15日在7:15