不幸的是,这个问题的前提很模糊,但我无法指出更具体的问题。我将一台机器从 nginx 1.6.3 升级到 1.8,现在发出一个nginx -s quit
命令实际上没有任何作用。该命令没有输出,access_log 和 error_log 文件没有显示任何异常,即使使用调试级别/var/log/nginx/error.log
在所有 vhost 中启用。除了“信号进程已启动”通知外,没有其他内容。pgrep nginx
显示进程停留在那里,就像什么都没发生一样。
我知道退出信号不一定会立即停止 nginx,因为它应该退出优雅地但这里的问题是,即使机器装有防火墙、隔离且不处理任何请求,nginx -s quit
它仍然什么也不做。在与 1.6.3 完全相同的条件下,进程会立即停止。
我完全不知道该如何调试这个问题并找到根本原因,但显然有些地方不对劲。任何能为我指明正确方向的帮助都将不胜感激。
编辑:我们看到的行为如下,一步一步:
- apt-get update/upgrade 将机器上的 nginx 1.6.3 升级到 1.8(当提示安装新的 /etc/nginx/nginx.conf 时)
sudo nginx -s quit
首次按预期工作sudo service nginx start
使 nginx 恢复预期sudo nginx -s quit
第二次不再执行任何操作,即使重新启动后仍会保持原样
我们在虚拟机中测试了多次,结果一致。也许这是 1.8 中的一个错误?
答案1
由于某些我们尚未找到的原因,在我们的环境中,nginx 创建了两个 pid 文件:/run/nginx.pid
和/var/run/nginx.pid
。无论 nginx 版本如何,这种情况似乎都会发生,因此似乎它本身并不是 nginx 错误。
运行nginx -s quit
不会像应该的那样终止和删除 pid,但service nginx stop
确实会。因此,为了在最新的 nginx 版本中正常重启,我们必须同时运行:
sudo nginx -s quit
sudo service nginx stop
(大约一分钟后,即可正常退出)sudo service nginx start
quit
只要通过服务命令停止 nginx 以确保 pid 不会滞后,后续信号就会正常工作。