我是新来的,在这里遇到了一些麻烦。
我使用的是Mac OS和nginx 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 21827
、kill -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,我就不能终止它。然后我就把它放在那里了。
然后我尝试在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运行的正确的初始步骤吗?
3条答案
按热度按时间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
。mpbci0fu2#
是不是因为您在某个地方悄悄启动了nginx,而它已经在运行了?您可以停止该进程,也可以终止通过
ps -ef | grep nginx
找到的进程。laximzn53#
我也遇到了完全相同的问题,我尝试了其他方法,幸运的是在活动监视器的网络选项卡中强制退出nginx进程解决了我在Mac中的问题。