Nginx:[Emerg]绑定()到Mac上的0.0.0.0:8080失败(48:地址已在使用中)

wlwcrazw  于 2022-09-20  发布在  Nginx
关注(0)|答案(3)|浏览(320)

我是新来的,在这里遇到了一些麻烦。

我使用的是Mac OSnginx version: nginx/1.17.7

我第一次下载Nginx是在一段时间之前。当时,一切都运行得很完美。然后,当我玩nginx.conf时,不知何故,我把它搞砸了。所以,当我今天重新开始学习nginx时,我删除了之前所有的文件,并通过自制软件重新安装了它。然后,我希望有人能帮我解决的问题突然出现了。

在初始化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)'(source)

以下是输出:

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 nginx(source)重新启动nginx,但不起作用。它报告了nginx: [alert] kill(21827, 15) failed (3: No such process)。所以我尝试了同一来源提供的另一个答案:brew services list,然后是brew services start nginx

但我还是得了小病。

现在我不知道如何解决这个问题。我还试着用自制软件重新安装了nginx。但之前的流程将一如既往地出现。

此外,我还尝试了这个命令:ps aux | grep nginx。在我终止进程之前,这给了我三个进程。在经历了这一切之后,我得到了

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

不确定这能说明什么。

有什么能帮助解决这里出了什么问题吗?或者,你能分享让Nginx运行的正确的初始步骤吗?

oyt4ldly

oyt4ldly1#

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

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

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

ps输出中需要注意的另一件事是:有两个nginx进程。一个是师傅,一个是工人。只要主进程正在运行,您就可以一次又一次地终止工作进程,主进程将产生一个新的工作进程(使用另一个新的ID)。文档中说“主进程的主要目的是读取和评估配置文件,以及维护工作进程。”

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

lsof -nPL -iTCP:8080

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

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

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

mpbci0fu

mpbci0fu2#

是不是因为您在某个地方悄悄启动了nginx,而它已经在运行了?您可以停止该进程,也可以终止通过ps -ef | grep nginx找到的进程。

laximzn5

laximzn53#

我也遇到了完全相同的问题,我尝试了其他方法,幸运的是在活动监视器的网络选项卡中强制退出nginx进程解决了我在Mac中的问题。

相关问题