最近、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を使用しているなど、他には何も確認していません。
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の違いは違いますが、さまざまなエラーの説明を見つけることができませんでした。
NginxのHomebrewのインストールで非常によく似た問題がありました。以前のNginxインストールをlaunchdプロセスとして実行していましたが、以前にアンインストールしたことがあります(おそらくlauchctl unload
itまたはHomebrewがアンインストール時にリンクを解除しませんでした)。とにかく、Nginxはbrew list
もnetstat
も、ポートを使用しているプロセスを見つけることができませんでした。 lsof
でしか検出できませんでした。
Sudo lsof -i 4tcp:8080
プロセスは実行中でポートを使用していましたが、どこにも見つかりませんでした(Sudo find / -name nginx -type d
ディスク全体を検索してnginxという名前のディレクトリを探しますが、成功しません)。テーブルに対して頭を叩いた後、アクティビティモニターがプロセスのファイルを開くためのパスを示しているかどうかを確認することを考えました。
アクティビティモニターを開き、プロセスを見つけてダブルクリックすると、プロセスの詳細を示す別のウィンドウが開きます。
プロセスとそのファイルがリストされていても、ファイルはディスク上に存在しませんでした。実行中のゾンビNginxプロセスを強制終了するだけで、新しいNginxインストールが期待どおりに実行されました。
よくわかりませんが、正しく思い出せば、ps aux | grep nginx
と表示されませんでしたが、一見の価値があります。
Sudo ps aux | grep nginx