【问题标题】:Nginx daemon stop is failingNginx 守护进程停止失败
【发布时间】:2012-02-10 01:22:14
【问题描述】:

我已经安装了 nginx 1.0.11 的 Ubuntu 11.04 i386 服务器。另外,我正在使用this init.d script,这是我在几个不同地方找到的唯一一个。它很好地启动了服务器,但是,在停止/重置时它说

* Stopping Nginx Server...      [fail]

当然,守护进程不会停止,并且在重新启动时不会重新加载配置。

我该如何修复这个问题?

【问题讨论】:

    标签: ubuntu nginx daemon init.d


    【解决方案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中定义的文件中
            • 当你运行service nginx stop时,它会停止PID根据/usr/lib/systemd/system/nginx.service定义的进程(你的路径可能不同)
              • 这意味着进程实际上并未停止。
            • 当您尝试再次启动它时,它会尝试绑定到同一端口并引发错误。

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

            解决方案

            正确修复:

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

            怎么做?nginx.confnginx.service定义的pid文件应该是一样的。

            修补程序:

            1. lsof -i | grep nginx

            这将为您提供 pid。就我而言,有两个。

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

            【讨论】:

              【解决方案7】:

              这是我修改的一个nginx init脚本(基于官方的init脚本),我把脚本的变量做成了

              lockfile=$pidfile 
              

              和变量

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

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

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

              也是。

              终于可以正常使用所有的nginx命令了。

              【讨论】: