我使用 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