【问题标题】:nginx: [emerg] bind() to 0.0.0.0:8080 failed (48: Address already in use) on macnginx: [emerg] bind() to 0.0.0.0:8080 failed (48: Address already in use) on mac
【发布时间】:2021-02-19 11:25:20
【问题描述】:

我是 Nginx 新手,在这里遇到了一些麻烦。

我正在使用 Mac OSnginx version: nginx/1.17.7

我第一次下载 Nginx 是很久以前的事了。那时,一切都运行得很完美。然后当我玩nginx.conf 时,我不知何故搞砸了。所以,当我今天重新开始学习 Nginx 时,我将之前的所有文件都删除了,并通过 homebrew 重新安装了它。然后我希望有人可以帮助我的问题突然出现。

初始化Nginx后,出现这个错误

nginx: [emerg] bind() to 0.0.0.0:8080 failed (48: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:8080 failed (48: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:8080 failed (48: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:8080 failed (48: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:8080 failed (48: Address already in use)
nginx: [emerg] still could not bind()

我在网上搜索了这个问题。有很多答案,但要么解决方案适用于 Linux 而不是 Mac,要么就是无法工作。

我找到的最有希望的答案之一是杀死 processes,它们在某种程度上使用了该端口。 顺便说一句,即使我有这个错误,我也可以访问页面localhost:8080,但它是403 Forbidden page然后我在Terminal上尝试了一个命令:ps ax -o pid,ppid,%cpu,vsz,wchan,command|egrep '(nginx|PID)'(@987654321 @)

这是输出:

  PID  PPID  %CPU      VSZ WCHAN  COMMAND
21827     1   0.0  4291640 -      nginx: master process nginx
21828 21827   0.0  4301348 -      nginx: worker process
21831 93689   0.0  4267768 -      egrep (nginx|PID)

我不(仍然不)明白这说明了什么,所以我试图通过kill -9 <PID> 杀死所有这些人,即kill -9 21827kill -9 21828kill -9 21831

然后我得到一个错误:-bash: kill: (21827) - Operation not permitted。我只是想也许sudo 可以解决这个问题,所以我尝试了sudo kill -9 21827。而这一次成功了。我杀死了所有进程,但第三个。当我尝试sudo kill -9 21831 时,我得到了No such process。然后我发现这是因为这个进程的PID 出于某种原因一直在变化,所以如果我没有在那个确切的时刻捕捉到进程的确切 PID,我就无法'杀了它。然后我就这样放在那里了。

然后我尝试在Terminal 上运行nginx。这是输出:

nginx: [emerg] open() "/usr/local/var/run/nginx.pid" failed (13: Permission denied)

这次我没有找到有可能解决这个问题的答案...所以我尝试通过命令sudo nginx -s stop && sudo nginxsource重启nginx,但这并没有不行。它报告了nginx: [alert] kill(21827, 15) failed (3: No such process)。所以我尝试了同一来源中提供的另一个答案:brew services list,然后是brew services start nginx

但我还是得到了nginx: [emerg] open() "/usr/local/var/run/nginx.pid" failed (13: Permission denied)

现在我不知道如何解决这个问题。我也尝试通过自制软件重新安装 nginx。但是之前的进程会像它们一样弹出。

此外,我也尝试了这个命令:ps aux | grep nginx。在我杀死进程之前,这给了我三个进程。毕竟这些,我才得到

apple            22922   0.0  0.0  4267768    832 s003  S+    3:09AM   0:00.00 grep nginx

不知道这能说明什么。

有什么可以帮忙的吗?或者,您能否分享让 Nginx 运行的正确初始步骤?

【问题讨论】:

    标签: macos nginx


    【解决方案1】:

    这里发生了很多事情。首先,Mac OS 是 Linux 的近亲。许多 Linux 解决方案/命令将在您的 Mac 上本地运行。通常可以修改那些不能使它们工作的。在某些情况下,您可能需要安装 Mac OS 中默认未安装的其他命令行工具。

    其次,ps 是“进程状态”的缩写。顾名思义,它是一个报告您机器上运行的进程状态的命令(您的权限允许您查看)。使用kill 来终止进程当然是可能的,有时也可能是必要的。但是,如果您不知道自己在做什么,我不会推荐它。正如您所发现的,根据您的操作系统权限/设置,您可能需要使用 sudo 来覆盖。依靠 nginx 命令来启动和停止正在运行的 nginx 服务器可能会更好。这样做的一件事是允许“优雅地”执行这些操作,也就是说“干净地”和“没有意外的副作用”。稍后会详细介绍。

    ps 输出中第三个进程的 PID 不断变化的原因是因为该进程本身就是被报告的 egrep 进程。每次运行该命令时,都会执行一个新的egrep 命令并获得它自己闪亮的新 PID。

    在您的 ps 输出中要注意的另一件事:有 2 个 nginx 进程。一个是master,另一个是worker。只要主进程在运行,你就可以一遍又一遍地杀死工作进程,主进程就会产生一个新的工作进程(带有另一个新的 PID)。文档说“主进程的主要目的是读取和评估配置文件,以及维护工作进程。”

    现在,听起来好像另一个进程已经在使用端口 8080。您可以通过运行以下命令了解该进程是什么:

    lsof -nPL -iTCP:8080

    根据lsof 命令返回的内容,您可以使用报告的PID 退出程序或终止进程。如果由于某种原因,您不能或不想终止违规进程,则必须更改 nginx 的配置。

    正如错误消息所暗示的,您现在遇到了文件/usr/local/var/run/nginx.pid 的权限问题,导致nginx 无法启动。该文件包含在启动时分配给nginx 进程的PID。当您发出命令nginx -s stop 时,它会尝试从该文件中读取先前分配的PID。如果不能,则会失败并显示您所看到的错误消息。

    使用kill 终止nginx 进程的一个意外副作用是它们没有机会自行清理。他们在关机时做的一件事是删除包含先前分配的 PID 的 nginx.pid 文件。好消息是,如果该文件不存在,nginx 将创建一个新文件。所以你所要做的就是运行sudo rm /usr/local/var/run/nginx.pid,然后运行nginx

    【讨论】:

    • 我查看了您提到的步骤,但即使在删除 nginx.pid 之后,我也无法停止 nginx 也无法重新启动。此外,当我运行“sudo nginx -s stop”时,我得到“nginx:[error] open()“/usr/local/Cellar/nginx/1.21.6_1/logs/nginx.pid”失败(2:没有这样的文件或目录) "
    • ........TL;DR
    【解决方案2】:

    是不是因为你在某个地方默默地启动了 nginx 并且它已经在运行了?您可以停止它或终止通过ps -ef | grep nginx 找到的进程。

    【讨论】:

      【解决方案3】:

      我也遇到了完全相同的问题,我尝试了其他所有方法,但幸运的是,在 Activity Monitor 的网络选项卡中强制退出 nginx 进程修复了我在 mac 中的问题。

      【讨论】: