ApacheネットワークエラーAH00072:make_sock:アドレスにバインドできませんでした
序章
Apache AH00072: make_sock: could not bind to address
Apacheが使用するように設定されているのと同じポートでリッスンしている別のプロセスがある場合、エラーメッセージが生成されます。 通常、ポートは標準ポートになります 80
HTTP接続またはポートの場合 443
HTTPS接続の場合。 ただし、ポートが別のプロセスと競合すると、AH00072エラーが発生する可能性があります。
エラーは、基盤となるオペレーティングシステムシステムのネットワークスタックに起因します。 問題は、一度に1つのプロセスのみをポートにバインドできることです。 Nginxなどの別のWebサーバーがポートでリッスンするように構成されている場合 80
実行中の場合、Apacheは自分自身のポートを要求できなくなります。
Apacheとのポートの競合を検出するには、調査する必要があります systemctl
と journalctl
エラーの原因となっている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のステータスを確認します。
- sudo systemctl status apache2.service -l --no-pager
CentOSおよびFedoraシステムでは、次のコマンドを使用してApacheのステータスを調べます。
- 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から派生したシステムでは、次のコマンドを実行します。
- sudo journalctl -u apache2.service --since today --no-pager
CentOS、Fedora、およびRedHatから派生したシステムでは、次のコマンドを使用してログを検査します。
- 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
このチュートリアルの次のセクションで。
トラブルシューティング ss
と ps
ユーティリティ
AH00072エラーのトラブルシューティングを行うには、Apacheが使用しようとしているIPアドレスとポートでリッスンしている他のプロセスを特定する必要があります。 最近のほとんどのLinuxディストリビューションには、 ss
これは、システムのネットワークソケットの状態に関する情報を収集するために使用できます。
前に journalctl
セクションでは、ポートのIPv4アドレスとIPv6アドレスに何かがすでにバインドされています 80
. 次のコマンドは、ポートでIPv4インターフェイスにすでにバインドされているプロセスの名前を判別します 80
. と異なる場合は、エラーメッセージのポートに置き換えてください。 80
次のコマンドで:
- sudo ss -4 -tlnp | grep 80
へのフラグ ss
コマンドは、次の方法でデフォルトの出力を変更します。
-4
制限しますss
IPv4関連のソケット情報のみを表示します。-t
出力をに制限しますtcp
ソケットのみ。-l
すべてのリスニングソケットを-4
と-t
考慮される制限。-n
‘httpのようなプロトコル名ではなく、ポート番号が表示されるようにしますor
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))
繰り返しますが、問題のポート番号を journalctl
強調表示されているものと異なる場合は出力 80
ここに与えられます。
IPv4エラーとIPv6エラーの両方の場合で、 ss
出力は、プロセスID 40のプログラムがあることを示します( pid=40
出力で)にバインドされています 0.0.0.0:80
と [::]:80
それぞれインターフェース。 このプロセスは、Apacheがすでにポートを所有しているため、Apacheの起動を妨げています。 プログラムの名前を決定するには、 ps
このようなユーティリティは、強調表示された代わりに出力からプロセスIDを置き換えます 40
この例の値:
- sudo ps -p 40
次のような出力が表示されます。
OutputPID 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
このような出力:
OutputLISTEN 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を起動できなくなる原因となっているプロセスの名前を見つけるためのユーティリティ。