web-dev-qa-db-ja.com

nginx error_logは、「bind()to 0.0.0.0:80 failed(48:Address already in use)」を報告します

最近、OS X 10.9 MavericksのMacPortsを介してnginxとPHP-FPMをインストールしましたが、正常に動作しますが、メインのerror_logで継続的にポート80が使用されています。

2013/10/25 11:27:36 [emerg] 4510#0: bind() to 0.0.0.0:80 failed (48: Address already in use)
2013/10/25 11:27:36 [notice] 4510#0: try again to bind() after 500ms
2013/10/25 11:27:36 [emerg] 4510#0: bind() to 0.0.0.0:80 failed (48: Address already in use)
2013/10/25 11:27:36 [notice] 4510#0: try again to bind() after 500ms
2013/10/25 11:27:36 [emerg] 4510#0: bind() to 0.0.0.0:80 failed (48: Address already in use)
2013/10/25 11:27:36 [notice] 4510#0: try again to bind() after 500ms
2013/10/25 11:27:36 [emerg] 4510#0: bind() to 0.0.0.0:80 failed (48: Address already in use)
2013/10/25 11:27:36 [notice] 4510#0: try again to bind() after 500ms
2013/10/25 11:27:36 [emerg] 4510#0: bind() to 0.0.0.0:80 failed (48: Address already in use)
2013/10/25 11:27:36 [notice] 4510#0: try again to bind() after 500ms
2013/10/25 11:27:36 [emerg] 4510#0: still could not bind()

Apacheがポート80を使用しているなど、他には何も確認していません。

8
JCobb

this one のようないくつかの場所でソリューションを検索する場合、ソリューションはデフォルトのホストのlistenディレクティブ行を削除/コメントアウトすることです。

#listen       80 default_server;

これを行っても何も変わりませんでした。メインのerror_logはいっぱいになり続けました。

最後に nginxフォーラム の誰かが同様の問題のトラブルシューティングを行い、

ps ax -o pid,ppid,%cpu,vsz,wchan,command|egrep '(nginx|PID)'

私にとっては

  PID  PPID  %CPU      VSZ WCHAN  COMMAND
 4963     1   0.0  2504128 -      /opt/local/bin/daemondo --label=nginx --start-cmd /opt/local/sbin/nginx ; --pid=fileauto --pidfile /opt/local/var/run/nginx/nginx.pid
 4967     1   0.0  2475388 -      nginx: master process /opt/local/sbin/nginx
 4969  4967   0.0  2476412 -      nginx: worker process
 5024  1538   0.0  2432784 -      egrep (nginx|PID)
 1969  1874   0.0  2432772 -      tail -F /opt/local/etc/nginx/logs/error.log

最初の行で、pidfileの場所がMacPortsの起動コマンド--pidfile /opt/local/var/run/nginx/nginx.pidで設定されており、nginx.confで指定した場所とは異なることに気付きました。 pidエントリを変更して、startコマンドで指定した内容に一致させました。

pid        /opt/local/var/run/nginx/nginx.pid;

Nginxを再起動し、error_log(tail -F /opt/local/etc/nginx/logs/error.log)を追跡した後、問題が修正されたことに気付きました。

つまり、nginxのMacPortsバージョンを使用している場合は、pidfileの場所を変更する必要はありません。

余談ですが、この問題を解決しようとしている他のページ、特にlistenディレクティブを削除することで問題が修正されたページ、またはApacheのようなものがポート80を使用していたページを見ると、これらのエラーに気付くでしょうログは言う

[emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

そして私のものは

[emerg] bind() to 0.0.0.0:80 failed (48: Address already in use)

エラー98とエラー48の違いは違いますが、さまざまなエラーの説明を見つけることができませんでした。

8
JCobb

NginxのHomebrewのインストールで非常によく似た問題がありました。以前のNginxインストールをlaunchdプロセスとして実行していましたが、以前にアンインストールしたことがあります(おそらくlauchctl unload itまたはHomebrewがアンインストール時にリンクを解除しませんでした)。とにかく、Nginxはbrew listnetstatも、ポートを使用しているプロセスを見つけることができませんでした。 lsofでしか検出できませんでした。

Sudo lsof -i 4tcp:8080

プロセスは実行中でポートを使用していましたが、どこにも見つかりませんでした(Sudo find / -name nginx -type dディスク全体を検索してnginxという名前のディレクトリを探しますが、成功しません)。テーブルに対して頭を叩いた後、アクティビティモニターがプロセスのファイルを開くためのパスを示しているかどうかを確認することを考えました。

アクティビティモニターを開き、プロセスを見つけてダブルクリックすると、プロセスの詳細を示す別のウィンドウが開きます。

Activity Monitor process details window screenshot

プロセスとそのファイルがリストされていても、ファイルはディスク上に存在しませんでした。実行中のゾンビNginxプロセスを強制終了するだけで、新しいNginxインストールが期待どおりに実行されました。

よくわかりませんが、正しく思い出せば、ps aux | grep nginxと表示されませんでしたが、一見の価値があります。

Sudo ps aux | grep nginx
2
jean377