502 bad gateway
Nginx+php-fpm 502 bad gateway
nginxの出現502には多くの原因があるが、大部分の原因は資源の数が足りないこと、すなわちバックエンドphp-fpm処理に問題があることに帰結できる.nginxは、バックエンドのphp−fpmプロセスに正しいクライアント要求を送ったが、php−fpmプロセスの問題でphpコードを正しく解析できず、最終的にクライアント502にエラーを返した.
一、問題分析
nginx+phpに502 bad gatewayが現れ、一般的にはnginxの問題ではなくfastcgiまたはphpの問題によるものである.
理由1:
Php.iniのmemory_Limit小さすぎ
理由2:
php-fpm.conf中max_childrenまたはmax_requests設定が不合理です
理由3:
Client head buffer,fastcgi buffer size小さすぎる
理由4:
php実行時間が長すぎる
理由5:
php-cgi接続数が負荷を超えている
二、最適化方式
1.php-fpmプロセス数が足りない高調linuxカーネルオープンファイル数
3.スクリプト実行タイムアウト
4.キャッシュ設定が小さい
5.phpスクリプトの実行時間が長すぎる
三、参考文摘
nginxの出現502には多くの原因があるが、大部分の原因は資源の数が足りないこと、すなわちバックエンドphp-fpm処理に問題があることに帰結できる.nginxは、バックエンドのphp−fpmプロセスに正しいクライアント要求を送ったが、php−fpmプロセスの問題でphpコードを正しく解析できず、最終的にクライアント502にエラーを返した.
一、問題分析
nginx+phpに502 bad gatewayが現れ、一般的にはnginxの問題ではなくfastcgiまたはphpの問題によるものである.
理由1:
Php.iniのmemory_Limit小さすぎ
: php ,
理由2:
php-fpm.conf中max_childrenまたはmax_requests設定が不合理です
cgi , , , children , 1G 64,2G128。 。
PHP FastCGI :netstat -anop |grep php-cgi | wc -l
FastCGI FastCGI , , FastCGI , 。
( php-fpm.log, )
理由3:
Client head buffer,fastcgi buffer size小さすぎる
# pstream sent too big header while reading response headerfrom upstream
理由4:
php実行時間が長すぎる
# nginx fast-cgi timeout 。
# nginx
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout300;
keepalive_timeout;
# php-fpm
request_terminate_timeout,
# php.ini
max_execution_time
理由5:
php-cgi接続数が負荷を超えている
php-fpm max_requests , children 。
, children , children , children , 502。
0[ ]( )
二、最適化方式
1.php-fpmプロセス数が足りない
netstat -napo |grep "php-fpm" | wc -l fastcgi , conf , 。
, , php-fpm 100 , 4G 200 。
max_children PHP-FPM Pool , 。
10G PHP-FPM Pool, PHP 10M-40M, PHP 25M, max_children = 10G/25M = 409。
,
max_requests , unlimited( 1024), ( 500 ),
( root )
echo 'ulimit -HSn 65536'>> /etc/profile
echo 'ulimit -HSn 65536'>> /etc/rc.local
source /etc/profile
3.スクリプト実行タイムアウト
# , , 。
# nginx.conf
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
# php-fpm.conf
request_terminate_timeout =10s
4.キャッシュ設定が小さい
nginx.conf
proxy_buffer_size 64k;
proxy_buffers 512k;
proxy_busy_buffers_size 128k;
5.phpスクリプトの実行時間が長すぎる
reload php-fpm。
php , php-fpm 。
php-cgi 502 , 。
, crontab php-fpm , PHP 。
*/10* * * * /usr/local/php/sbin/php-fpm reload
三、参考文摘
1.Compile PHP’s modules as less as possible, the simple the best (fast);
2. Increas PHP FastCGI child number to 100 and even more.Sometime, 200 is OK! ( On 4GB memory server);
3.Using SOCKET PHP FastCGI, and put into /dev/shm on Linux;
4. Increase Linux “max open files”, using the following command(must be root):
# echo ‘ulimit -HSn 65536′>> /etc/profile
# echo ‘ulimit -HSn 65536 >> /etc/rc.local
# source /etc/profile
5.Increase PHP-FPM open file description limit:
# vi /path/to/php-fpm.conf
Find “1024 ”
Change 1024 to 4096 or higher number.
Restart PHP-FPM.
6. Using PHP code accelerator,e.g eAccelerator, XCache. And set “cache_dir” to /dev/shm on Linux.