簡體   English   中英

nginx: [emerg] bind() to 0.0.0.0:8080 failed (48: Address already in use) on mac

[英]nginx: [emerg] bind() to 0.0.0.0:8080 failed (48: Address already in use) on mac

我是 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)' ( 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得到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: [emerg] open() "/usr/local/var/run/nginx.pid" failed (13: Permission denied)

現在我不知道如何解決這個問題。 我也嘗試通過自制軟件重新安裝 nginx。 但是之前的過程會像它們一樣彈出。

另外,我也試過這個命令: ps aux | grep nginx ps aux | grep nginx 在我殺死進程之前,這給了我三個進程。 在所有這些之后,我得到了

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

不知道這能說明什么。

有什么可以幫助的嗎? 或者,您能否分享運行 Nginx 的正確初始步驟?

這里發生了很多事情。 首先,Mac OS 是 Linux 的近親。 許多 Linux 解決方案/命令將在您的 Mac 上本地運行。 那些沒有的通常可以修改以使其工作。 在某些情況下,您可能需要安裝 Mac OS 中默認未安裝的其他命令行工具。

其次, ps是“進程狀態”的縮寫。 顧名思義,它是一個報告在您的機器上運行的進程狀態的命令(您的權限允許您查看)。 使用kill來終止進程當然是可能的,有時可能是必要的。 但是,如果您不知道自己在做什么,我不會推薦它。 正如您所發現的,根據您的操作系統權限/設置,您可能需要使用sudo來覆蓋。 依靠 nginx 命令來啟動和停止正在運行的 nginx 服務器可能更好。 這將做的一件事是允許這些操作“優雅地”執行,也就是說“干凈地”和“沒有意外的副作用”。 稍后再談。

ps輸出中第三個進程的 PID 不斷變化的原因是因為該進程是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進程的一個意想不到的副作用是它們沒有機會自己進行清理。 他們在關機時做的一件事是刪除包含先前分配的 PID 的nginx.pid文件。 好消息是,如果該文件不存在,那么nginx將創建一個新文件。 所以你所要做的就是運行sudo rm /usr/local/var/run/nginx.pid然后運行nginx

我也遇到了完全相同的問題,我嘗試了其他所有方法,但幸運的是在 Activity Monitor 的網絡選項卡中強制退出 nginx 進程修復了我在 mac 中的問題。

是不是因為你在某個地方默默地啟動了 nginx 並且它已經在運行? 您可以停止或終止通過ps -ef | grep nginx找到的進程ps -ef | grep nginx ps -ef | grep nginx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM