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のステータスを確認します。
UbuntuとDebianシステム
sudo systemctl status apache2.service -l --no-pager
CentOSおよびFedoraシステムでは、次のコマンドを使用してApacheのステータスを調べます。
CentOSとFedoraシステム
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は、「httporhttps」のようなプロトコル名ではなく、ポート番号が表示されるようにします。 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を起動できなくなる原因となっているプロセスの名前を見つける方法を学びました。