序章

Apache AH00072: make_sock: could not bind to address Apacheが使用するように設定されているのと同じポートでリッスンしている別のプロセスがある場合、エラーメッセージが生成されます。 通常、ポートは標準ポートになります 80 HTTP接続またはポートの場合 443 HTTPS接続の場合。 ただし、ポートが別のプロセスと競合すると、AH00072エラーが発生する可能性があります。

エラーは、基盤となるオペレーティングシステムシステムのネットワークスタックに起因します。 問題は、一度に1つのプロセスのみをポートにバインドできることです。 Nginxなどの別のWebサーバーがポートでリッスンするように構成されている場合 80 実行中の場合、Apacheは自分自身のポートを要求できなくなります。

Apacheとのポートの競合を検出するには、調査する必要があります systemctljournalctl エラーの原因となっているIPアドレスとポートを特定するための出力。 次に、問題を解決する方法を決定できます。それは、Webサーバーを切り替えるか、Apacheが使用するIPアドレス、ポート、またはこれらのオプションの任意の組み合わせを変更することです。

トラブルシューティング systemctl

このシリーズの冒頭にある一般的なApacheエラーのトラブルシューティング方法チュートリアルのトラブルシューティング手順に従って、トラブルシューティングを行う際の最初の手順 AH00072: make_sock: could not bind to address エラーメッセージは、Apacheのステータスを次のように確認することです。 systemctl.

もしも systemctl 問題を説明する出力が含まれていないため、このチュートリアルの最後のセクションjournalctlログを使用したトラブルシューティングでは、 systemd 競合するポートを見つけるためにログを記録します。

からの出力 systemctl status 多くの場合、エラーを解決するために必要なすべての診断情報が含まれます。 これには、Apacheが使用しているIPアドレスと、バインドしようとしているポートが含まれます。 出力には、Apacheを起動できなかった期間も表示されるため、問題がApacheに影響を与えている期間を判断できます。

UbuntuおよびDebianから派生したLinuxディストリビューションでは、以下を実行してApacheのステータスを確認します。

UbuntuとDebianシステム
  1. sudo systemctl status apache2.service -l --no-pager

CentOSおよびFedoraシステムでは、次のコマンドを使用してApacheのステータスを調べます。

CentOSとFedoraシステム
  1. sudo systemctl status httpd.service -l --no-pager

The -l フラグは systemctl 楕円で置き換えるのではなく、行の内容全体を出力します()長い行の場合。 The --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 出力には、 systemd AH00072エラーを説明するジャーナル。 これらの行は、どちらもで始まります (98)Address already in use: AH00072: make_sock: could not bind to address、さらにトラブルシューティングする必要があるAH00072エラーに関するすべての情報を提供します。これにより、以下をスキップできます。 journalctl 手順を実行し、代わりに、このチュートリアルの最後にあるssおよびpsユーティリティのトラブルシューティングセクションに進んでください。

もしあなたの systemctl 出力には、AH00072エラーの原因となっているIPアドレスとポートに関する特定の情報が表示されないため、調査する必要があります。 journalctl からの出力 systemd ログ。 次のセクションでは、使用方法について説明します journalctl AH00072エラーのトラブルシューティングを行います。

を使用したトラブルシューティング journalctl ログ

もしあなたの systemctl 出力にはAH00072エラーに関する詳細が含まれていません。使用を続行する必要があります。 journalctl 調べるコマンド systemd Apacheのログ。

UbuntuおよびDebianから派生したシステムでは、次のコマンドを実行します。

  1. sudo journalctl -u apache2.service --since today --no-pager

CentOS、Fedora、およびRedHatから派生したシステムでは、次のコマンドを使用してログを検査します。

  1. sudo journalctl -u httpd.service --since today --no-pager

The --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 ポートであるアドレス 80 利用可能なすべてのIPv6インターフェイス。 次の行、アドレス 0.0.0.0:80、Apacheがポートにバインドできないことを示します 80 利用可能なすべてのIPv4インターフェース。 システムの構成によっては、IPアドレスが異なり、個々のIPのみが表示され、IPv4またはIPv6エラーのみが含まれる場合があります。

独自のシステムで競合するインターフェイスとポートが異なる場合でも、エラーはここに示す出力と同様になります。 からの出力で journalctl を使用して問題を診断できるようになります ss このチュートリアルの次のセクションで。

トラブルシューティング ssps ユーティリティ

AH00072エラーのトラブルシューティングを行うには、Apacheが使用しようとしているIPアドレスとポートでリッスンしている他のプロセスを特定する必要があります。 最近のほとんどのLinuxディストリビューションには、 ss これは、システムのネットワークソケットの状態に関する情報を収集するために使用できます。

前に journalctl セクションでは、ポートのIPv4アドレスとIPv6アドレスに何かがすでにバインドされています 80. 次のコマンドは、ポートでIPv4インターフェイスにすでにバインドされているプロセスの名前を判別します 80. と異なる場合は、エラーメッセージのポートに置き換えてください。 80 次のコマンドで:

  1. sudo ss -4 -tlnp | grep 80

へのフラグ ss コマンドは、次の方法でデフォルトの出力を変更します。

  • -4 制限します ss IPv4関連のソケット情報のみを表示します。
  • -t 出力をに制限します tcp ソケットのみ。
  • -l すべてのリスニングソケットを -4-t 考慮される制限。
  • -n ‘httpのようなプロトコル名ではなく、ポート番号が表示されるようにしますorhttps`。 Apacheが非標準のポートにバインドしようとしている可能性があり、実際のポート番号ではなくサービス名が混乱する可能性があるため、これは重要です。
  • -p ポートにバインドされているプロセスに関する情報を出力します。

これらのフラグをすべて使用すると、次のような出力が返されます。

Output
LISTEN 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ネットワークスタックに制限するフラグを設定します。

  1. sudo ss -6 -tlnp |grep 80
Output
LISTEN 0 511 [::]:80 [::]:* users:(("nginx",pid=40,fd=7))

繰り返しますが、問題のポート番号を journalctl 強調表示されているものと異なる場合は出力 80 ここに与えられます。

IPv4エラーとIPv6エラーの両方の場合で、 ss 出力は、プロセスID 40のプログラムがあることを示します( pid=40 出力で)にバインドされています 0.0.0.0:80[::]:80 それぞれインターフェース。 このプロセスは、Apacheがすでにポートを所有しているため、Apacheの起動を妨げています。 プログラムの名前を決定するには、 ps このようなユーティリティは、強調表示された代わりに出力からプロセスIDを置き換えます 40 この例の値:

  1. sudo ps -p 40

次のような出力が表示されます。

Output
PID TTY TIME CMD 40 ? 00:00:00 nginx

強調表示 nginx 出力には、インターフェースをリッスンしているプロセスの名前が含まれています。 Apacheの起動を妨げているプログラムの名前がわかったので、エラーを解決する方法を決定できます。 あなたは停止することができます nginx プロセス、再構成 nginx 別のインターフェイスとポートでリッスンするか、ポートの衝突を回避するためにApacheを再設定します。

プロセスはとは異なる場合があることに注意することが重要です nginx ポートとIPアドレスは必ずしもそうではないかもしれません 0.0.0.0 また [::] AH00072エラーを診断している場合。 多くの場合、異なるWebサーバーとプロキシが同じサーバーで使用されます。 それぞれが、異なるWebトラフィックを処理するために異なるIPv4ポートおよびIPv6インターフェースにバインドしようとしている可能性があります。 たとえば、IPv4ループバックアドレスをリッスンするHAProxyで構成されたサーバー(別名 localhost)ポート上 8080 表示されます ss このような出力:

Output
LISTEN 0 2000 127.0.0.1:8080 0.0.0.0:* users:(("haproxy",pid=545,fd=7))

組み合わせることが重要です systemctl 出力、または journalctl 特定のIPアドレスとポートを示す出力とからの診断データ ss、 その後 ps Apacheの起動に失敗する原因となっているプロセスを絞り込みます。

結論

このチュートリアルでは、Apacheのトラブルシューティング方法を学びました AH00072 make_sock: could not bind to address IPv4インターフェイスとIPv6インターフェイスの両方でエラーメッセージが表示されます。 使い方を学びました systemctl Apacheサーバーのステータスを調べて、エラーメッセージを見つけようとします。 使い方も学びました journalctl 調べるために systemd AH00072エラーに関する特定の情報をログに記録します。

ログからの適切なエラーメッセージを使用して、次に ss ユーティリティと、それを使用してシステムのネットワークソケットの状態を調べる方法。 その後、プロセスID情報を組み合わせる方法を学びました。 ss とともに ps Apacheを起動できなくなる原因となっているプロセスの名前を見つけるためのユーティリティ。