サイトに「502 Bad Gateway」エラーが表示されて困っていませんか?PHP-FPMやリバースプロキシ設定の問題から、具体的な診断・解決方法まで実践的に解説します。
こんなトラブルで困っていませんか?
- サイトに突然「502 Bad Gateway」エラーが表示された
- WordPressやLaravelサイトにアクセスできない
- エラーログを見ても原因が分からない
- PHP-FPMやnginxの設定に不安がある
- サーバー管理者から「502エラーを解決して」と言われた
3分でこの記事の要点が分かります。Fivenine Designでは20年以上のWeb制作実績で培った、nginx 502エラーの確実な解決方法をお教えします。
nginx 502 Bad Gatewayエラーとは?
502 Bad Gatewayエラーは、nginxがバックエンドサーバー(PHP-FPMなど)からの応答を受け取れない状態を示します。
先月、あるクライアントのECサイトで「朝から注文が一件も入らない」という緊急連絡がありました。確認すると、サイト全体に502エラーが表示されていました。売上に直結する重大なトラブルだったため、即座に原因を特定し、15分で復旧できました。
主要原因と診断方法
1. PHP-FPM停止・異常終了(最頻出)
症状: サイト全体が502エラー 診断方法:
# PHP-FPMの状態確認
sudo systemctl status php8.1-fpm
# プロセス確認
ps aux | grep php-fpm
# エラーログ確認
sudo tail -f /var/log/php8.1-fpm.log
解決手順:
# PHP-FPM再起動
sudo systemctl restart php8.1-fpm
# 自動起動設定確認
sudo systemctl enable php8.1-fpm
# 設定ファイル構文チェック
sudo php-fpm8.1 -t
2. タイムアウト設定の問題
症状: 重い処理で502エラーが発生 よくあるケース: WordPressのプラグイン更新、Laravelの大量データ処理
nginx設定例 (/etc/nginx/sites-available/default):
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.php index.html;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# タイムアウト設定(重要)
fastcgi_read_timeout 300;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
}
}
3. ソケット接続設定ミス
nginx設定とPHP-FPM設定の不一致が原因です。
PHP-FPM設定確認 (/etc/php/8.1/fpm/pool.d/www.conf):
[www]
user = www-data
group = www-data
# ソケット設定
listen = /var/run/php/php8.1-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
# プロセス管理
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 1000
接続確認方法:
# ソケットファイル存在確認
ls -la /var/run/php/php8.1-fpm.sock
# 権限確認
stat /var/run/php/php8.1-fpm.sock
# nginxがソケットにアクセスできるか確認
sudo -u www-data test -r /var/run/php/php8.1-fpm.sock && echo "OK" || echo "NG"
実案件での解決事例
ケース1: WordPressサイトの502エラー
あるクライアントの企業サイトで、記事投稿時に必ず502エラーが発生する問題がありました。
原因: メディアファイルのアップロード時にPHP-FPMのメモリ制限に達していました。
解決策:
# /etc/php/8.1/fpm/php.ini
memory_limit = 512M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300
# /etc/php/8.1/fpm/pool.d/www.conf
pm.max_children = 20
pm.max_requests = 500
結果: 投稿エラーが解消され、「安心して記事更新できるようになった」とお客様から好評をいただきました。
ケース2: Laravelアプリケーションの502エラー
ECサイトのLaravelアプリで、商品検索時にランダムに502エラーが発生していました。
原因: upstream設定でのロードバランシング設定ミス
nginx設定改善:
upstream php-backend {
server unix:/var/run/php/php8.1-fpm.sock weight=1 max_fails=3 fail_timeout=30s;
# 複数のPHP-FPMプールを使用する場合
# server unix:/var/run/php/php8.1-fpm-pool2.sock weight=1 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
server_name shop.example.com;
root /var/www/laravel/public;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass php-backend;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
# Laravel向け最適化
fastcgi_read_timeout 120;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
}
}
よくある失敗と注意点
失敗例1: 設定変更後の再起動忘れ
「設定を変更したのに502エラーが続く」というお問い合わせをよくいただきます。設定変更後は必ず関連サービスを再起動してください。
# 正しい再起動手順
sudo nginx -t # nginx設定チェック
sudo systemctl reload nginx
sudo systemctl restart php8.1-fpm
失敗例2: ログ確認の軽視
エラーログを確認せずに憶測で対応すると、時間を無駄にします。
# 必ず確認すべきログファイル
sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/log/php8.1-fpm.log
sudo tail -f /var/www/html/storage/logs/laravel.log # Laravel場合
失敗例3: リソース不足の見落とし
サーバーのリソース状況を確認せずに設定変更すると、逆にパフォーマンスが悪化することがあります。
# リソース確認コマンド
free -h # メモリ使用量
df -h # ディスク使用量
top # CPU・メモリの詳細
htop # より見やすいリソース監視
予防策とモニタリング
監視スクリプトの設置
#!/bin/bash
# /usr/local/bin/check-502-error.sh
LOG_FILE="/var/log/nginx/access.log"
ERROR_COUNT=$(tail -1000 "$LOG_FILE" | grep "502" | wc -l)
if [ $ERROR_COUNT -gt 5 ]; then
echo "502エラーが頻発しています: $ERROR_COUNT件"
# メール通知やSlack通知の処理
systemctl status php8.1-fpm
fi
定期メンテナンス項目
- 週次: エラーログの確認とローテーション
- 月次: PHP-FPM設定の見直し
- 四半期: サーバーリソースの使用状況確認
CMS・フレームワーク別の対策
WordPress向け設定
# WordPress用の最適化設定
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# WordPress特有の設定
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 8 64k;
# 管理画面での長時間処理対応
location ~ ^/wp-admin/.*\.php$ {
fastcgi_read_timeout 600;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Laravel向け設定
# Laravel用の設定
server {
listen 80;
server_name laravel-app.com;
root /var/www/laravel/public;
index index.php;
# Laravel用の基本設定
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
# Laravelの大量処理対応
fastcgi_read_timeout 180;
client_max_body_size 100M;
}
# 静的ファイルのキャッシュ設定
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
まとめ:確実な502エラー解決のために
nginx 502 Bad Gatewayエラーは、原因を正確に特定すれば確実に解決できるトラブルです。
今すぐやるべきこと:
- エラーログの確認:
/var/log/nginx/error.logと/var/log/php-fpm.logをチェック - PHP-FPMの状態確認:
systemctl status php-fpmでプロセス状況を確認 - 設定ファイルの構文チェック:
nginx -tとphp-fpm -tで設定ミスがないか確認
重要な点:
- 憶測ではなく、必ずログを確認する
- 設定変更後は関連サービスを再起動する
- 定期的な監視とメンテナンスを怠らない
サーバートラブルでお困りの方へ
「502エラーが解決できない」「サーバー設定に不安がある」「緊急でサイトを復旧したい」
そんなときは、Fivenine Designにお任せください。
神奈川を拠点に20年以上のWeb制作実績を持つ当社では、nginx・PHP-FPM・Apache等のサーバートラブルを迅速かつ確実に解決いたします。Laravel・WordPress・Next.jsを使った開発で培った豊富な運用経験により、お客様のサイトを安定稼働させます。
- 24時間以内の緊急対応可能
- 原因調査から恒久対策まで一括サポート
- 再発防止のための監視体制構築
- 中小企業様の予算に合わせた柔軟な提案
まずはお気軽にご相談ください。サーバートラブルによる機会損失を最小限に抑え、安心してビジネスに集中できる環境を提供いたします。