nginx error_log 报告“bind() to 0.0.0.0:80 failed (48: Address already in use)”

nginx error_log 报告“bind() to 0.0.0.0:80 failed (48: Address already in use)”

我最近在 OS X 10.9 Mavericks 上通过 MacPorts 安装了 nginx 和 PHP-FPM,虽然它可以运行,但我的主错误日志不断显示端口 80 正在使用中。

2013/10/25 11:27:36 [emerg] 4510#0: bind() to 0.0.0.0:80 failed (48: Address already in use)
2013/10/25 11:27:36 [notice] 4510#0: try again to bind() after 500ms
2013/10/25 11:27:36 [emerg] 4510#0: bind() to 0.0.0.0:80 failed (48: Address already in use)
2013/10/25 11:27:36 [notice] 4510#0: try again to bind() after 500ms
2013/10/25 11:27:36 [emerg] 4510#0: bind() to 0.0.0.0:80 failed (48: Address already in use)
2013/10/25 11:27:36 [notice] 4510#0: try again to bind() after 500ms
2013/10/25 11:27:36 [emerg] 4510#0: bind() to 0.0.0.0:80 failed (48: Address already in use)
2013/10/25 11:27:36 [notice] 4510#0: try again to bind() after 500ms
2013/10/25 11:27:36 [emerg] 4510#0: bind() to 0.0.0.0:80 failed (48: Address already in use)
2013/10/25 11:27:36 [notice] 4510#0: try again to bind() after 500ms
2013/10/25 11:27:36 [emerg] 4510#0: still could not bind()

我已经验证没有其他任何东西(例如 Apache)正在使用端口 80。

答案1

在寻找解决方案时,有几个地方,例如这个说解决方案是删除/注释掉listen默认主机中的指令行。

#listen       80 default_server;

这样做并没有给我带来任何改变,主错误日志仍然继续填满。

终于有人nginx 论坛解决类似问题建议查看输出

ps ax -o pid,ppid,%cpu,vsz,wchan,command|egrep '(nginx|PID)'

对我来说

  PID  PPID  %CPU      VSZ WCHAN  COMMAND
 4963     1   0.0  2504128 -      /opt/local/bin/daemondo --label=nginx --start-cmd /opt/local/sbin/nginx ; --pid=fileauto --pidfile /opt/local/var/run/nginx/nginx.pid
 4967     1   0.0  2475388 -      nginx: master process /opt/local/sbin/nginx
 4969  4967   0.0  2476412 -      nginx: worker process
 5024  1538   0.0  2432784 -      egrep (nginx|PID)
 1969  1874   0.0  2432772 -      tail -F /opt/local/etc/nginx/logs/error.log

我注意到第一行中 pidfile 的位置是在 MacPorts 的启动命令中设置的--pidfile /opt/local/var/run/nginx/nginx.pid,并且它与我在 中指定的位置不同nginx.conf。我将pid条目改回启动命令指定的位置:

pid        /opt/local/var/run/nginx/nginx.pid;

重新启动 nginx 并跟踪 error_log( tail -F /opt/local/etc/nginx/logs/error.log) 后,我注意到问题已得到解决。

简而言之:如果您使用的是 MacPorts 版本的 nginx,您可能不想更改 pidfile 的位置。

另外,如果你查看其他试图解决此问题的页面,特别是那些通过删除指令解决问题的页面listen,或者 Apache 等其他程序也在使用端口 80 的页面,你会注意到那些错误日志显示

[emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

而我的

[emerg] bind() to 0.0.0.0:80 failed (48: Address already in use)

我怀疑错误之间的区别98和错误四十八是区别,但我无法找到各种错误的任何描述。

答案2

我在使用 Homebrew 安装 Nginx 时遇到了类似的问题。我有一个较旧的 Nginx 安装作为 launchd 进程运行,尽管我之前已经卸载过它(可能是我没有卸载,lauchctl unload或者 Homebrew 没有在卸载时取消链接它)。无论如何,Nginx 不会出现,brew listnetstat无法找到使用该端口的进程。我只能用以下命令检测它lsof

sudo lsof -i 4tcp:8080

该进程正在运行并使用端口,但我无法在任何地方找到它(我甚至尝试在sudo find / -name nginx -type d整个磁盘中查找名为 nginx 的目录,但没有成功)。经过一番苦思冥想后,我想检查活动监视器是否显示了该进程打开文件的路径,结果确实如此。

打开活动监视器,找到该进程,双击它,它将打开另一个窗口,其中包含进程详细信息:

活动监视器进程详细信息窗口屏幕截图

尽管列出了进程及其文件,但文件并不存在于磁盘上。我只需强制退出正在运行的僵尸 Nginx 进程,然后新的 Nginx 安装即可按预期运行。

我不确定,但如果我没记错的话我也尝试过ps aux | grep nginx,但没有出现,但值得一试:

sudo ps aux | grep nginx

答案3

如果你在“网络”选项卡中找不到 nginx,请查看此内容

  1. 运行ps -ef | grep nginx。如果在停止进程后仍能看到某些进程在运行,则可能是进程没有正确停止
  2. 正确终止/杀死它
  3. 转到活动监视器(在 Mac Spotlight 搜索中搜索活动监视器)
  4. 进入网络
  5. 搜索nginx并全部退出。
  6. 在某些情况下,你不会nginx在网络中找到
  7. 然后转到CPU并搜索nginx
  8. 您必须找到一些nginx消耗 CPU 的进程。
  9. 把它们全部退出。
  10. 现在尝试运行sudo nginx。一切都应该按预期进行。✅

相关内容