502 Bad Gateway nginxの解決方法【2025年最新版】
エラーの概要・症状
502 Bad Gatewayエラーは、Nginxサーバーがリクエストを処理する際に、バックエンドのサーバー(例えば、PHP-FPMやuWSGIなど)からの無効な応答を受け取った場合に発生します。このエラーは、ウェブサイトの運営者や開発者にとって非常に厄介で、ユーザーにとっても不快な体験をもたらします。具体的には、ウェブサイトにアクセスしようとした際に「502 Bad Gateway」と表示され、ページが表示されないことになります。
このエラーが発生すると、ユーザーは「サーバーがダウンしているのか」、「ページが見つからないのか」といった疑問を抱くことになります。また、ウェブサイトの信頼性や可用性が損なわれるため、ビジネスにも悪影響を及ぼす可能性があります。このため、502 Bad Gatewayエラーは迅速に解決する必要があります。
このエラーが発生する原因
502 Bad Gatewayエラーは、さまざまな原因によって発生することがあります。以下では、主要な原因を詳しく説明します。
1. バックエンドサーバーの停止
Nginxはリバースプロキシとして機能し、バックエンドサーバーからのレスポンスを待っています。バックエンドサーバーが停止している場合、Nginxは502エラーを返します。特にPHP-FPMやuWSGIなどのプロセスがクラッシュしていると、このエラーが発生します。
2. 設定ミス
Nginxやバックエンドサーバーの設定ミスも502エラーの原因となります。たとえば、nginx.conf
ファイルでのproxy_pass
設定やfastcgi_pass
設定が正しくない場合、リクエストが正しく処理されず、502エラーが発生します。
3. アクセス権の問題
SELinuxなどのセキュリティモジュールが有効な場合、Nginxがバックエンドサービスにアクセスできないことがあります。この場合、権限が不足しているためリクエストが拒否され、502エラーが発生します。
4. サーバーのリソース不足
サーバーのメモリやCPUリソースが不足していると、バックエンドサーバーが正しくリクエストに応答できない場合があります。特にトラフィックが急増した際には、この問題が顕著になります。
5. ソケットファイルの問題
uWSGIやPHP-FPMを使用している場合、ソケットファイルのパーミッション設定が不適切であると、Nginxがバックエンドサーバーと通信できず、502エラーが発生することがあります。
解決方法1(最も効果的)
最も効果的な解決策は、SELinuxの設定を確認し、必要に応じて修正することです。以下に具体的な手順を示します。
H3: 手順1-1(SELinuxの設定を確認する)
- SELinuxの現在の状態を確認します。以下のコマンドを実行してください。
sestatus
SELinuxが有効である場合、次のステップに進んでください。
H3: 手順1-2(SELinuxの設定を変更する)
- 以下のコマンドを使用して、
httpd_can_network_connect
を有効にします。
sudo setsebool -P httpd_can_network_connect 1
- 次に、Nginxがバックエンドサーバーに接続できるか確認します。以下のコマンドを実行して、エラーログをチェックします。
sudo cat /var/log/audit/audit.log | grep nginx | grep denied
- エラーが出ている場合、次のコマンドで新しいポリシーを作成します。
sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M mynginx
sudo semodule -i mynginx.pp
- 最後に、
httpd_can_network_relay
も有効にします。
sudo setsebool -P httpd_can_network_relay 1
H3: 注意点とトラブルシューティング
- SELinuxの設定を変更することは、セキュリティに影響を与える可能性があるため、十分に理解した上で行ってください。設定変更後、Nginxおよびバックエンドサーバーを再起動することを忘れないでください。
- Nginxを再起動するには、以下のコマンドを実行します。
解決方法2(代替手段)
もし、SELinuxの設定を変更しても502エラーが解決しない場合、次の方法を試してみてください。
- Nginx設定ファイルの
fastcgi_pass
の設定を確認します。
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
ここで、fastcgi_pass
が正しいパスであることを確認してください。
- PHP-FPMが正しく動作しているか確認します。以下のコマンドを実行して、PHP-FPMのステータスを確認します。
sudo systemctl status php7.4-fpm
ステータスが「active」と表示されていれば、正常に動作しています。
- サーバーのリソース状況を確認し、負荷が高い場合には必要なリソースを追加します。特にメモリやCPUの使用状況を確認してください。
top
やhtop
コマンドを使って確認できます。
解決方法3(上級者向け)
上級者向けの解決策として、Nginxのソケットファイルのパーミッション設定を見直すことが挙げられます。以下の手順に従ってください。
- ソケットファイルのパーミッションを確認します。以下のコマンドを実行します。
ls -l /var/run/php/php7.4-fpm.sock
ここで、ソケットファイルの所有者とパーミッションが正しいことを確認します。推奨されるパーミッションは660
です。
- 必要に応じて、以下のコマンドでパーミッションを変更します。
sudo chmod 660 /var/run/php/php7.4-fpm.sock
- NginxとPHP-FPMを再起動します。
sudo systemctl restart nginx
sudo systemctl restart php7.4-fpm
エラーの予防方法
502 Bad Gatewayエラーを防ぐためには、以下の予防策を講じることが重要です。
- **定期的なサーバーメンテナンス**: サーバーのリソース使用状況やエラーログを定期的にチェックし、異常がないか確認します。特に、トラフィックが急増する時間帯には注意が必要です。
- **セキュリティ設定の見直し**: SELinuxやファイアウォールの設定を定期的に見直し、必要なサービスに対して適切なアクセス権を設定します。
- **バックアップの実施**: 定期的にバックアップを行い、障害時には迅速に復旧できるようにします。
関連するエラーと対処法
502 Bad Gatewayエラーに関連する他のエラーには、以下のようなものがあります。
- **504 Gateway Timeout**: バックエンドサーバーが応答しない場合に発生します。タイムアウト設定を見直し、必要に応じて延長します。
- **500 Internal Server Error**: サーバー内部で何らかのエラーが発生した場合に表示されます。エラーログを確認し、原因を特定します。
まとめ
502 Bad Gatewayエラーは、Nginxとバックエンドサーバー間の通信エラーによって発生します。SELinuxの設定やNginxの設定ミス、サーバーリソース不足などが主な原因です。今回紹介した解決方法を参考に、迅速に問題を解決し、安定したウェブサイト運営を目指しましょう。次のステップとして、定期的なメンテナンスやセキュリティチェックを行い、エラーの再発を防ぐことが重要です。
コメント