这个问题的前提不幸是模糊的,但我不能指出一个更具体的问题。 我把一台机器从nginx 1.6.3升级到了1.8,现在发布一个nginx -s quit
并没有什么意义。 该命令不输出,即使在所有虚拟主机中启用了debugging级别 ,access_log和error_log文件也不会显示任何exception。 /var/log/nginx/error.log
除了“信号进程启动”通知之外,也没有任何内容。 pgrep nginx
显示进程停留在那里,没有发生任何事情。
我知道退出信号并不一定会立即停止nginx,因为它应该正常退出,但问题是,即使机器被防火墙隔离,并且没有处理任何请求, nginx -s quit
仍然不会执行任何操作。 在与1.6.3完全相同的条件下,过程立即停止。
我完全丧失了如何debugging这个问题,并find根本原因,但显然有些不对劲。 任何帮助指出我正确的方向将不胜感激。
编辑:我们看到的行为是以下,一步一步:
sudo nginx -s quit
第一次sudo nginx -s quit
按预期工作 sudo service nginx start
将nginx带回原样 sudo nginx -s quit
第二次sudo nginx -s quit
,什么都不做了,重启后也会保持原状 我们在VM中多次testing,结果是一致的。 也许这是1.8的错误?
由于某种原因,我们还没有find,在我们的环境nginx创build两个PID文件: /run/nginx.pid
和/var/run/nginx.pid
。 这似乎发生,无论nginx版本,所以它似乎不是一个nginx错误本身。
运行nginx -s quit
不会像应该那样service nginx stop
和删除pid,但是service nginx stop
。 所以为了在最新的nginx版本中做一个平稳的重启,我们必须运行两个:
sudo nginx -s quit
sudo service nginx stop
(过了一分钟左右,给优雅的退出时间) sudo service nginx start
然后,只要nginx通过服务命令停止,后续的quit
信号就会正常工作,以确保pid不会滞后。