ApacheネットワークエラーAH00072:make_sock:アドレスにバインドできませんでした
序章
Apache AH00072: make_sock: could not bind to address
エラーメッセージは、Apacheが使用するように構成されているのと同じポートでリッスンしている別のプロセスがある場合に生成されます。 通常、ポートはHTTP接続の場合は標準ポート80
、HTTPS接続の場合はポート443
になります。 ただし、ポートが別のプロセスと競合すると、AH00072エラーが発生する可能性があります。
エラーは、基盤となるオペレーティングシステムシステムのネットワークスタックに起因します。 問題は、一度に1つのプロセスのみをポートにバインドできることです。 Nginxのような別のWebサーバーがポート80
でリッスンするように構成されていて、それが実行されている場合、Apacheはそれ自体のポートを要求できません。
Apacheとのポートの競合を検出するには、systemctl
およびjournalctl
の出力を調べて、エラーの原因となっているIPアドレスとポートを特定する必要があります。 次に、問題を解決する方法を決定できます。それは、Webサーバーを切り替えるか、Apacheが使用するIPアドレス、ポート、またはこれらのオプションの任意の組み合わせを変更することです。
systemctl
を使用したトラブルシューティング
このシリーズの冒頭にある一般的なApacheエラーのトラブルシューティング方法チュートリアルのトラブルシューティング手順に従って、AH00072: make_sock: could not bind to address
エラーメッセージのトラブルシューティングを行う最初の手順は、systemctl
。
systemctl
に問題を説明する出力が含まれていない場合、このチュートリアルの最後のセクション journalctl Logs を使用したトラブルシューティングでは、systemd
ログを調べて競合を見つける方法について説明します。ポート。
systemctl status
からの出力には、多くの場合、エラーを解決するために必要なすべての診断情報が含まれています。 これには、Apacheが使用しているIPアドレスと、バインドしようとしているポートが含まれます。 出力には、Apacheを起動できなかった期間も示されるため、問題がApacheに影響を与えている期間を判断できます。
UbuntuおよびDebianから派生したLinuxディストリビューションでは、以下を実行してApacheのステータスを確認します。
- sudo systemctl status apache2.service -l --no-pager
CentOSおよびFedoraシステムでは、次のコマンドを使用してApacheのステータスを調べます。
- sudo systemctl status httpd.service -l --no-pager
-l
フラグは、systemctl
が長い行を楕円(…
)に置き換えるのではなく、行の内容全体を出力することを保証します。 --no-pager
フラグは、一度にコンテンツの画面のみを表示するless
のようなツールを呼び出さずに、ログ全体を画面に出力します。
AH00072: make_sock
エラーメッセージのトラブルシューティングを行っているため、次のような出力が表示されます。
Output● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Tue 2020-07-28 13:58:40 UTC; 8s ago
Docs: man:httpd.service(8)
Process: 69 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
Main PID: 69 (code=exited, status=1/FAILURE)
Status: "Reading configuration..."
Tasks: 213 (limit: 205060)
Memory: 25.9M
CGroup: /system.slice/containerd.service/system.slice/httpd.service
Jul 28 13:58:40 e3633cbfc65e systemd[1]: Starting The Apache HTTP Server…
Jul 28 13:58:40 e3633cbfc65e httpd[69]: (98)Address already in use: AH00072: make_sock: could not bind to address [::]:80
Jul 28 13:58:40 e3633cbfc65e httpd[69]: (98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80
Jul 28 13:58:40 e3633cbfc65e httpd[69]: no listening sockets available, shutting down
Jul 28 13:58:40 e3633cbfc65e httpd[69]: AH00015: Unable to open logs
Jul 28 13:58:40 e3633cbfc65e systemd[1]: httpd.service: Main process exited, code=exited, status=1/FAILURE
Jul 28 13:58:40 e3633cbfc65e systemd[1]: httpd.service: Failed with result 'exit-code'.
Jul 28 13:58:40 e3633cbfc65e systemd[1]: Failed to start The Apache HTTP Server.
UbuntuまたはDebianから派生したディストリビューションを使用している場合、出力がわずかに異なる場合があることに注意してください。Apacheプロセスの名前はhttpd
ではなく、apache2
です。
この例のsystemctl
出力には、AH00072エラーを説明するsystemd
ジャーナルからの強調表示された行が含まれています。 どちらも(98)Address already in use: AH00072: make_sock: could not bind to address
で始まるこれらの行は、さらにトラブルシューティングする必要があるAH00072エラーに関するすべての情報を提供するため、次のjournalctl
の手順をスキップして、代わりにこのチュートリアルの最後にあるssおよびpsユーティリティセクションのトラブルシューティング。
systemctl
出力で、AH00072エラーの原因となっているIPアドレスとポートに関する特定の情報が得られない場合は、systemd
ログからのjournalctl
出力を調べる必要があります。 。 次のセクションでは、journalctl
を使用してAH00072エラーのトラブルシューティングを行う方法について説明します。
journalctl
ログを使用したトラブルシューティング
systemctl
出力にAH00072エラーの詳細が含まれていない場合は、journalctl
コマンドを使用して、Apacheのsystemd
ログを調べる必要があります。
UbuntuおよびDebianから派生したシステムでは、次のコマンドを実行します。
- sudo journalctl -u apache2.service --since today --no-pager
CentOS、Fedora、およびRedHatから派生したシステムでは、次のコマンドを使用してログを検査します。
- sudo journalctl -u httpd.service --since today --no-pager
--since today
フラグは、コマンドの出力を、当日の00:00:00から始まるエントリをログに記録するように制限します。 このオプションを使用すると、エラーをチェックするときに調べる必要のあるログエントリの量を制限するのに役立ちます。
Apacheが使用中のポートにバインドできない場合は、出力を検索して、次のログエントリに類似した行、特にこの例で強調表示されているAH00072エラーコードを含む行を探します。
Output-- Logs begin at Tue 2020-07-14 20:10:37 UTC, end at Tue 2020-07-28 14:01:40 UTC. --
. . .
Jul 28 14:03:01 b06f9c91975d apachectl[71]: (98)Address already in use: AH00072: make_sock: could not bind to address [::]:80
Jul 28 14:03:01 b06f9c91975d apachectl[71]: (98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80
Jul 28 14:03:01 b06f9c91975d apachectl[71]: no listening sockets available, shutting down
この出力は、2つのAH00072エラーを示しています。 これらの最初のものは、Apacheが[::]:80
アドレスにバインドできないことを説明しています。これは、使用可能なすべてのIPv6インターフェイスのポート80
です。 アドレス0.0.0.0:80
の次の行は、Apacheが使用可能なすべてのIPv4インターフェイスのポート80
にバインドできないことを示しています。 システムの構成によっては、IPアドレスが異なり、個々のIPのみが表示され、IPv4またはIPv6エラーのみが含まれる場合があります。
独自のシステムで競合するインターフェイスとポートが異なる場合でも、エラーはここに示す出力と同様になります。 journalctl
からの出力を使用すると、このチュートリアルの次のセクションでss
を使用して問題を診断できます。
ss
およびps
ユーティリティを使用したトラブルシューティング
AH00072エラーのトラブルシューティングを行うには、Apacheが使用しようとしているIPアドレスとポートでリッスンしている他のプロセスを特定する必要があります。 最新のLinuxディストリビューションのほとんどには、ss
と呼ばれるユーティリティが含まれており、システムのネットワークソケットの状態に関する情報を収集するために使用できます。
前のjournalctl
セクションでは、ポート80
のIPv4アドレスとIPv6アドレスにすでに何かがバインドされていました。 次のコマンドは、ポート80
でIPv4インターフェイスにすでにバインドされているプロセスの名前を判別します。 次のコマンドで80
と異なる場合は、エラーメッセージのポートに置き換えてください。
- sudo ss -4 -tlnp | grep 80
ss
コマンドのフラグは、デフォルトの出力を次のように変更します。
-4
は、ss
がIPv4関連のソケット情報のみを表示するように制限します。-t
は、出力をtcp
ソケットのみに制限します。-l
は、-4
および-t
の制限を考慮したすべてのリスニングソケットを表示します。-n
は、「httpor
https」のようなプロトコル名ではなく、ポート番号が表示されるようにします。 Apacheが非標準のポートにバインドしようとしている可能性があり、実際のポート番号ではなくサービス名が混乱する可能性があるため、これは重要です。-p
は、ポートにバインドされているプロセスに関する情報を出力します。
これらのフラグをすべて使用すると、次のような出力が返されます。
OutputLISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=40,fd=6))
最初の3つのフィールドは、AH00072エラーのトラブルシューティングでは重要ではないため、無視できます。 重要なフィールドは4番目(0.0.0.0:80
)で、これは前に発見したjournalctl
エラーと、最後のusers:(("nginx",pid=40,fd=6))
、特にpid=40
の部分と一致します。 。
IPv6インターフェースに関連するAH00072エラーがある場合は、ss
呼び出しを繰り返します。今回は、-6
フラグを使用して、インターフェースを次のようにIPv6ネットワークスタックに制限します。
- sudo ss -6 -tlnp |grep 80
OutputLISTEN 0 511 [::]:80 [::]:* users:(("nginx",pid=40,fd=7))
ここでも、強調表示されている80
と異なる場合は、journalctl
出力の問題のポート番号に置き換えてください。
IPv4エラーとIPv6エラーのどちらの場合も、ss
出力は、0.0.0.0:80
にバインドされたプロセスID40(出力のpid=40
)を持つプログラムがあることを示します。 ]および[::]:80
インターフェース。 このプロセスは、Apacheがすでにポートを所有しているため、Apacheの起動を妨げています。 プログラムの名前を判別するには、次のようなps
ユーティリティを使用し、次の例で強調表示されている40
値の代わりに、出力のプロセスIDを置き換えます。
- sudo ps -p 40
次のような出力が表示されます。
OutputPID TTY TIME CMD
40 ? 00:00:00 nginx
出力で強調表示されているnginx
は、インターフェイスでリッスンしているプロセスの名前です。 Apacheの起動を妨げているプログラムの名前がわかったので、エラーを解決する方法を決定できます。 nginx
プロセスを停止するか、nginx
を再構成して別のインターフェイスとポートでリッスンするか、Apacheを再構成してポートの衝突を回避できます。
AH00072エラーを診断する場合、プロセスはnginx
とは異なる場合があり、ポートおよびIPアドレスが常に0.0.0.0
または[::]
であるとは限らないことに注意してください。 多くの場合、異なるWebサーバーとプロキシが同じサーバーで使用されます。 それぞれが、異なるWebトラフィックを処理するために異なるIPv4ポートおよびIPv6インターフェースにバインドしようとしている可能性があります。 たとえば、ポート8080
でIPv4ループバックアドレス(localhost
とも呼ばれる)をリッスンするHAProxyで構成されたサーバーは、次のようなss
出力を表示します。
OutputLISTEN 0 2000 127.0.0.1:8080 0.0.0.0:* users:(("haproxy",pid=545,fd=7))
systemctl
出力、または特定のIPアドレスとポートを示すjournalctl
出力を、ss
からの診断データと組み合わせてから、ps
を組み合わせて絞り込むことが重要です。 Apacheの起動に失敗する原因となっているプロセスをダウンさせます。
結論
このチュートリアルでは、IPv4インターフェイスとIPv6インターフェイスの両方でApacheAH00072 make_sock: could not bind to address
エラーメッセージをトラブルシューティングする方法を学習しました。 systemctl
を使用してApacheサーバーのステータスを調べ、エラーメッセージを見つけようとする方法を学びました。 また、journalctl
を使用して、systemd
ログでAH00072エラーに関する特定の情報を調べる方法も学習しました。
次に、ログからの適切なエラーメッセージを使用して、ss
ユーティリティと、それを使用してシステムのネットワークソケットの状態を調べる方法について学習しました。 その後、ss
のプロセスID情報をps
ユーティリティと組み合わせて、Apacheを起動できなくなる原因となっているプロセスの名前を見つける方法を学びました。