我是 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 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 由于某种原因一直在变化,所以如果我没有在那个时刻捕获该进程的确切 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 nginx(source)但这没有用。据报道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 所需遵循的正确初始步骤?
这里发生了很多事情。首先,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。
| 归档时间: |
|
| 查看次数: |
24642 次 |
| 最近记录: |