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.confnginx.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 守护进程

传输守护进程只是停止通量

守护进程

python 守护进程

来自守护进程的错误响应:无法停止容器 - 信号 init 进程导致“权限被拒绝”

启动Gradle守护程序,1个忙碌和6个停止的守护进程无法重用,请使用--status获取详细信息