我有一个已安装Nginx 1.0.11的Ubuntu 11.04 i386服务器。同时,我使用了这个init.d脚本,这是我在多个不同位置找到的唯一一个。它可以很好地启动服务器,但是,在停止/重置时会显示如下内容:
* Stopping Nginx Server... [fail]
当然,守护程序没有停止,在重新启动时配置也没有重新加载。
我该如何修复这个问题?
我有一个已安装Nginx 1.0.11的Ubuntu 11.04 i386服务器。同时,我使用了这个init.d脚本,这是我在多个不同位置找到的唯一一个。它可以很好地启动服务器,但是,在停止/重置时会显示如下内容:
* Stopping Nginx Server... [fail]
当然,守护程序没有停止,在重新启动时配置也没有重新加载。
我该如何修复这个问题?
很可能无法杀死进程。
打开位于 /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;
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>
尝试使用此命令:
sudo fuser -k 80/tcp
nginx.conf
中定义的文件中。
service nginx stop
时,它会停止根据/usr/lib/systemd/system/nginx.service
(您的路径可能不同)定义的PID进程。
基本上,您正在将PID写入位置A,并尝试从位置B读取它。这种不一致似乎是这个看似常见问题的根本原因。
我们需要确保读取和写入位置相同。
怎么做?:
在nginx.conf
和nginx.service
中定义的pid文件应该相同。
lsof -i | grep nginx
这将给您提供pid。在我的情况下,有两个。
kill -9 pid1
kill -9 pid2
(可能不需要)我曾经遇到过类似的问题。
通常我使用apache/apache2。
以下可能会对你有所帮助:
sudo nginx -s stop | ps -ef | grep nginx | awk {'print $2'} | xargs sudo kill -9 | sudo service apache2 start
有关文档,请参考此 Github Gist
这是一个我修改过的nginx init脚本(基于过时的官方init脚本),适用于许多基于Debian的发行版,包括Ubuntu 11.04:
https://github.com/hulihanapplications/nginx-init-debian
这在我的Ubuntu服务器上运行得非常好。希望能对你有所帮助。
lockfile=$pidfile
以及变量
pidfile="/var/run/nginx.pid"
然后我修改了配置文件(nginx.conf
),我设置了变量
pid="/var/run/nginx.pid"
太好了。
最终我可以正常使用所有的nginx命令。
/run/nginx.pid
替换为/var/run/nginx.pid
,然后它就可以工作了。谢谢! - Raza Ahmed