Nginx 守护进程停止失败
Posted
技术标签:
【中文标题】Nginx 守护进程停止失败【英文标题】:Nginx daemon stop is failing 【发布时间】:2012-02-10 01:22:14 【问题描述】:我已经安装了 nginx 1.0.11 的 Ubuntu 11.04 i386 服务器。另外,我正在使用this init.d script,这是我在几个不同地方找到的唯一一个。它很好地启动了服务器,但是,在停止/重置时它说
* Stopping Nginx Server... [fail]
当然,守护进程不会停止,并且在重新启动时不会重新加载配置。
我该如何修复这个问题?
【问题讨论】:
【参考方案1】:这是我修改的 nginx 初始化脚本(基于过时的 offical init script),适用于许多基于 debian 的发行版,包括 Ubuntu 11.04:
https://github.com/hulihanapplications/nginx-init-debian
这在我的 ubuntu 服务器上运行良好。希望这可以帮助。
【讨论】:
【参考方案2】:它可能无法杀死进程。
打开位于 /etc/init.d/(或 /etc/rc.d/)中的 nginx sysvinit 脚本并找到 nginx.pid 的位置。它将类似于“/var/run/nginx.pid”。
如果 pid 文件不存在,请打开 nginx.conf 并查找 pid 设置。如果不匹配 - 将 conf 值设置为脚本认为它应该在的位置,例如
# pid of nginx process
pid /var/run/nginx.pid;
【讨论】:
对我来说,我将 nginx.conf 中的/run/nginx.pid
替换为 /var/run/nginx.pid
并且它有效。谢谢!
谢谢 - 我在两个目录中都看到了 pid 文件,但是将 init 和 nginx.conf 更改为指向“var”目录反而解决了我的停止/重启脚本中的相同问题。跨度>
【参考方案3】:
sudo service nginx restart
会给你这样的东西:
Stopping nginx: [FAILED]
Starting nginx: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
然后通过端口手动终止进程:
sudo fuser -k 80/tcp
(或使用您正在使用的任何端口)
或者,通过 ID 杀死进程:
ps -ef |grep nginx
kill <pid>
【讨论】:
【参考方案4】:我也遇到过类似的问题。
一般我使用 apache/apache2。
以下内容可能会对您有所帮助:
sudo nginx -s stop | ps -ef | grep nginx | awk 'print $2' | xargs sudo kill -9 | sudo service apache2 start
文档请参考Github Gist
【讨论】:
【参考方案5】:试试这个命令:
sudo fuser -k 80/tcp
【讨论】:
【参考方案6】:此问题的原因
当你启动nginx时,它会将pid写入nginx.conf
中定义的文件中
参考:http://nginx.org/en/docs/ngx_core_module.html#pid
当你运行service nginx stop
时,它会停止PID根据/usr/lib/systemd/system/nginx.service
定义的进程(你的路径可能不同)
这意味着进程实际上并未停止。
当您尝试再次启动它时,它会尝试绑定到同一端口并引发错误。
基本上,您在位置 A 写入 PID 并尝试从位置 B 读取它。这种不一致似乎是这个明显常见问题的根本原因。
解决方案
正确修复:
我们需要确保读写位置相同。
怎么做?:
nginx.conf
和nginx.service
定义的pid文件应该是一样的。
修补程序:
lsof -i | grep nginx
这将为您提供 pid。就我而言,有两个。
kill -9 pid1
kill -9 pid2
(可能不需要)
【讨论】:
【参考方案7】:这是我修改的一个nginx init脚本(基于官方的init脚本),我把脚本的变量做成了
lockfile=$pidfile
和变量
pidfile="/var/run/nginx.pid"
然后我修改了配置文件(nginx.conf
),我做了变量
pid="/var/run/nginx.pid"
也是。
终于可以正常使用所有的nginx命令了。
【讨论】:
以上是关于Nginx 守护进程停止失败的主要内容,如果未能解决你的问题,请参考以下文章
如何使 systemd 杀死或停止重生 rsyslog 守护进程