nginx: [emerg] 在 mac 上绑定()到 0.0.0.0:8080 失败(48:地址已在使用中)

Nat*_*h J 10 macos nginx

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

我正在使用Mac 操作系统nginx 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()
Run Code Online (Sandbox Code Playgroud)

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

我发现的最有希望的答案之一是杀死那些processes使用该端口的人。顺便说一句,尽管我遇到了这个错误,但我可以访问该页面localhost:8080,但它是403 Forbidden page然后我尝试了一个命令Terminal:(ps ax -o pid,ppid,%cpu,vsz,wchan,command|egrep '(nginx|PID)'来源

这是输出:

  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)
Run Code Online (Sandbox Code Playgroud)

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

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

然后我尝试继续nginx跑步Terminal。这是输出:

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

这次我没有找到有可能解决这个问题的答案......所以我尝试通过命令重新启动nginxsudo nginx -s stop && sudo nginxsource)但这没有用。据报道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
Run Code Online (Sandbox Code Playgroud)

不确定这能说明什么。

有什么可以帮助这里出了什么问题吗?或者,您能否分享一下运行 Nginx 所需遵循的正确初始步骤?

wor*_*ded 7

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

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

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

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

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

lsof -nPL -iTCP:8080

根据lsof命令返回的内容,您可以使用报告的 . 退出程序或终止进程PID。如果由于某种原因,您不能或不想终止有问题的进程,那么您将必须更改nginx.

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

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