我最近在 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 list
也netstat
无法找到使用该端口的进程。我只能用以下命令检测它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,请查看此内容
- 运行
ps -ef | grep nginx
。如果在停止进程后仍能看到某些进程在运行,则可能是进程没有正确停止 - 正确终止/杀死它
- 转到活动监视器(在 Mac Spotlight 搜索中搜索活动监视器)
- 进入网络
- 搜索
nginx
并全部退出。 - 在某些情况下,你不会
nginx
在网络中找到 - 然后转到
CPU
并搜索nginx
。 - 您必须找到一些
nginx
消耗 CPU 的进程。 - 把它们全部退出。
- 现在尝试运行
sudo nginx
。一切都应该按预期进行。✅