nginxで502エラーが発生するケースとその対処法を説明する。
1. 設定ミス
nginxがphp-fpmに接続できない場合、fastcgi_passの指定に問題があることが多い。socket形式またはIP:ポート形式で正しく指定されているか確認が必要。
2. リソース不足
LNMP構成において、nginxからのリクエストがphp-fpmの処理能力を超過すると、子进程が不足し502エラーが発生する。
解决方法:php-fpm.confのpm.max_childrenパラメータを調整する。メモリに応じた適切な値を設定すること。
- メモリ4GB(php-fpm+nginx、Mysqlなし):pm.max_children = 150
- メモリ8GB:pm.max_children = 300
- これを目安にメモリ量に比例して増減させる
3. エラーログによる調査
nginxのエラーログを確認することで、問題の根本原因を特定できる。
vim /usr/local/nginx/logs/nginx_error.log
ログレベルはnginx.confで設定可能。crit(厳格)からdebug(詳細)まで変更できるが、debugはログ量が膨大になるため注意。
4. 設定手順
nginx設定ファイル
バーチャルホスト設定ファイルを作成する。
vim /usr/local/nginx/conf/vhosts/test.conf
server {
listen 80;
server_name www.test.com;
index index.html index.htm index.php;
root /var/www/html;
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/tmp/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
}
}
設定ファイルの構文を確認後、リロードする。
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
php-fpm設定ファイル
socketファイルの所有者とnginx実行用户在一致させる必要がある。
vim /usr/local/php/etc/php-fpm.conf
[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
[www]
listen = /tmp/php-fpm.sock
user = www-data
group = www-data
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 150
pm.start_servers = 30
pm.min_spare_servers = 10
pm.max_spare_servers = 50
pm.max_requests = 1000
rlimit_files = 2048
設定完了後、php-fpmを再起動する。
/etc/init.d/php-fpm restart
5. socketファイルのパーミッション問題
PHP 5.4以降では、socketファイルのデフォルト権限が 소유者の読み取りのみとなっている。nginx実行用户(www-data)がsocketを読み取れない場合、502エラーが発生する。
解決策として、php-fpm.confでsocketの所有者とグループを設定する方法がある。
listen.owner = www-data
listen.group = www-data
または、パーミッションを直接指定する方法もある。
listen.mode = 0660
どちらの方法でも、nginxがsocketファイルにアクセスできるように設定すれば、502エラーを回避できる。