502 bad gateway

3501 ワード

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小さすぎ
    :   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  ),               

  • 高調linuxカーネルオープンファイル数
  •         (   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.