Nginx守护进程停止失败

15

我有一个已安装Nginx 1.0.11的Ubuntu 11.04 i386服务器。同时,我使用了这个init.d脚本,这是我在多个不同位置找到的唯一一个。它可以很好地启动服务器,但是,在停止/重置时会显示如下内容:

* Stopping Nginx Server...      [fail]

当然,守护程序没有停止,在重新启动时配置也没有重新加载。

我该如何修复这个问题?

7个回答

30

很可能无法杀死进程。

打开位于 /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;

2
对我来说,在nginx.conf文件中,我将/run/nginx.pid替换为/var/run/nginx.pid,然后它就可以工作了。谢谢! - Raza Ahmed
谢谢 - 我在两个目录中都看到了pid文件,但是将init和nginx.conf更改为指向“var”目录而不是解决了我的停止/重新启动脚本上的相同问题。 - Scott

15

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>

3

尝试使用此命令:

sudo fuser -k 80/tcp

2

问题的原因

  • 当您启动nginx时,它会将pid写入nginx.conf中定义的文件中。
  • 当您运行service nginx stop时,它会停止根据/usr/lib/systemd/system/nginx.service(您的路径可能不同)定义的PID进程。
    • 这意味着该进程实际上并未停止。
  • 当您尝试再次启动它时,它会尝试绑定到相同的端口并抛出错误。

基本上,您正在将PID写入位置A,并尝试从位置B读取它。这种不一致似乎是这个看似常见问题的根本原因。

解决方法

正确的修复方法:

我们需要确保读取和写入位置相同。

怎么做?: 在nginx.confnginx.service中定义的pid文件应该相同。

临时解决方法:

  1. lsof -i | grep nginx

这将给您提供pid。在我的情况下,有两个。

  1. kill -9 pid1
  2. kill -9 pid2(可能不需要)

1

我曾经遇到过类似的问题。

通常我使用apache/apache2。

以下可能会对你有所帮助:

sudo nginx -s stop | ps -ef | grep nginx | awk {'print $2'} | xargs sudo kill -9 | sudo service apache2 start

有关文档,请参考此 Github Gist


0

0
这是我修改过的nginx启动脚本(基于官方启动脚本),我修改了脚本的变量。
lockfile=$pidfile 

以及变量

pidfile="/var/run/nginx.pid"

然后我修改了配置文件(nginx.conf),我设置了变量

pid="/var/run/nginx.pid" 

太好了。

最终我可以正常使用所有的nginx命令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接