79

構成

  • Ubuntu サーバー 11.10 64 ビット
  • クラウドでホストされている Amazon AWS、Ec2
  • t1.micro インスタンス

他のことを書く前に、 nginx 502 bad gatewayNginx + PHP-FPM 502 Bad Gatewayスレッドの両方をチェックしたことを述べたいと思いますが、残念ながらこの点では役に立ちませんでした.

この問題はかなり一般的なようです。nginx または php-fpm の構成ミスにより502 Bad Gatewayエラーが発生する可能性があり、これは私が取り除くことができなかったものです。これは、特定のディレクトリを指定せずにドメイン ルートに移動した場合でも表示されることに注意してください。

ポート 9000 を有効にし、ポート 80 を開いているなどの状態で、Amazon EC2 ウェブサーバーを実行しています。

特に問題は、どうすればこの厄介なエラーを取り除くことができるかということです。または、さらに良いことに、どうすれphp5-fpm実際に仕事をすることができますか.

これまでに試みたこと

構成ファイルのほとんど一貫した編集、特にphp-fpm.confnginx.conf.

私。 php-fpm.conf

以下を追加しましたが、あまり役に立ちませんでした。

;;;;;;;;;;;;;
; Fpm Start ;
;;;;;;;;;;;;;

;pm.start_servers = 20
;pm.min_spare_servers = 5
;pm.max_spare_servers = 35

さて、その後、構成ファイルを含めてみました:

include=/etc/php5/fpm/*.conf

それは私をさらに台無しにしただけです。

フル構成

;;;;;;;;;;;;;;;;;;;;;
; FPM Configuration ;
;;;;;;;;;;;;;;;;;;;;;

; All relative paths in this configuration file are relative to PHP's install
; prefix (/usr). This prefix can be dynamicaly changed by using the
; '-p' argument from the command line.

; Include one or more files. If glob(3) exists, it is used to include a bunch of
; files from a glob(3) pattern. This directive can be used everywhere in the
; file.
; Relative path can also be used. They will be prefixed by:
;  - the global prefix if it's been set (-p arguement)
;  - /usr otherwise
;include=/etc/php5/fpm/*.conf

;;;;;;;;;;;;;;;;;;
; Global Options ;
;;;;;;;;;;;;;;;;;;

[global]
; Pid file
; Note: the default prefix is /var
; Default Value: none
pid = /var/run/php5-fpm.pid

; Error log file
; Note: the default prefix is /var
; Default Value: log/php-fpm.log
error_log = /var/log/php5-fpm.log

; Log level
; Possible Values: alert, error, warning, notice, debug
; Default Value: notice
log_level = notice

; If this number of child processes exit with SIGSEGV or SIGBUS within the time
; interval set by emergency_restart_interval then FPM will restart. A value
; of '0' means 'Off'.
; Default Value: 0
;emergency_restart_threshold = 0

; Interval of time used by emergency_restart_interval to determine when 
; a graceful restart will be initiated.  This can be useful to work around
; accidental corruptions in an accelerator's shared memory.
; Available Units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
emergency_restart_interval = 0

; Time limit for child processes to wait for a reaction on signals from master.
; Available units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds
; Default Value: 0
;process_control_timeout = 0

; Send FPM to background. Set to 'no' to keep FPM in foreground for debugging.
; Default Value: yes
daemonize = no

;;;;;;;;;;;;;
; Fpm Start ;
;;;;;;;;;;;;;

;pm.start_servers = 20
;pm.min_spare_servers = 5
;pm.max_spare_servers = 35

;;;;;;;;;;;;;;;;;;;;
; Pool Definitions ; 
;;;;;;;;;;;;;;;;;;;;

; Multiple pools of child processes may be started with different listening
; ports and different management options.  The name of the pool will be
; used in logs and stats. There is no limitation on the number of pools which
; FPM can handle. Your system will tell you anyway :)

; To configure the pools it is recommended to have one .conf file per
; pool in the following directory:
include=/etc/php5/fpm/pool.d/*.conf

ii . nginx.conf

正直なところ、この構成は私が訪れたいくつかの Web サイトのほんの一部ですが、この 502 Bad Gateway ビジネスの前は、サーバーは正常に動作していました (PHP が動作していない期間.)。

問題は主に、何かがひどく、ひどく間違っているという事実にあります。そして今、私が実行しようとすると、無限ループか何かでservice php5-fpm restartあると私が推測しているものにハングアップします。CTRLC

フル構成

user www-data;
worker_processes 1;
pid /var/run/nginx.pid;

events {
    worker_connections 64;
    # multi_accept on;
}

http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush off;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

    server {
        listen 80;
        server_name ec2-xx-xx-xx-xx.compute-x.amazonaws.com;

        location ~ ^(.+\.php)(.*)$ {
            root   /home/wayvac/public;
            fastcgi_pass   unix:/var/run/php5-fpm.pid;  
            #fastcgi_pass   127.0.0.1:9000; #Un-comment this and comment "fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;" if you are not using php-fpm.
            fastcgi_index  index.php;
            set $document_root2 $document_root;
            if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; }
            if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; }
            if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; }
            if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; }
            if ($document_root2 ~ "^(.*\\\\).*?[\\\\|\/]\.\.\/(.*)$") { set $document_root2 $1$2; }
            fastcgi_split_path_info ^(.+\.php)(.*)$;
            fastcgi_param   SCRIPT_FILENAME $document_root2$fastcgi_script_name;
            fastcgi_param   PATH_INFO   $fastcgi_path_info;
            fastcgi_param   PATH_TRANSLATED $document_root2$fastcgi_path_info;
            include fastcgi_params;
            fastcgi_param  DOCUMENT_ROOT      $document_root2;
        }       

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        location / {
            root /home/wayvac/public;   
            index index.html index.htm index.php;
        }

        location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
            # Some basic cache-control for static files to be sent to the browser
            expires max;
            add_header Pragma public;
            add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        }

        #include drop.conf;
        #include php.conf;
    }
}
4

15 に答える 15

151

私が抱えていたのと同じ問題に遭遇して誰かがこのページを見つけた場合、私はここで答えを見つけました。

クリックして自分で解決するのが面倒な人のために... ;)

条件:

NGINX および PHP 5.3 を使用する Ubuntu または Debian サーバーは正常に動作しますが、PHP を 5.4 にアップグレードすると、502 Bad Gateway エラーが発生します。netstat -lpポート 9000 で実行されているサービス (通常は実行中または類似)を探しても、何も返されません。

修正:

/etc/php5/fpm/pool.d/www.conf「listen」パラメーターを開いてメモします (私の場合/var/run/php5-fpm.sock):

; The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific address on
;                            a specific port;
;   'port'                 - to listen on a TCP socket to all addresses on a
;                            specific port;
;   '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = /var/run/php5-fpm.sock

vhost の fastcgi_pass 変数を、先ほどメモした場所に置き換えます。

したがって、このサンプル symfony2 構成 (ここから取得):

  # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  location ~ ^/(app|app_dev)\.php(/|$) {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_split_path_info ^(.+\.php)(/.*)$;
    include fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
    fastcgi_param  HTTPS              off;
  }

これになります:

  # pass the PHP scripts to FastCGI server at /var/run/php5-fpm.sock
  location ~ ^/(app|app_dev)\.php(/|$) {
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_split_path_info ^(.+\.php)(/.*)$;
    include fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
    fastcgi_param  HTTPS              off;
  }

次に、nginx を再起動します。

sudo /etc/init.d/nginx restart

注: SF2 を使用していない場合は に置き換え~ ^/(app|app_dev)\.php(/|$) {てください**~ ^/index\.php(/|$) {

これが誰かの時間を少し節約することを願っています:)

編集

もちろん、listen = /var/run/php5-fpm.socktolisten = 127.0.0.1:9000を変更してから/etc/php5/fpm/pool.d/www.confphp5-fpm を再起動することもできます (これにより、仮想ホストを変更する必要がなくなります)。理由。

編集2

それでも 502 エラーが発生する場合は、この回答を参照してください。

于 2013-01-28T10:40:06.817 に答える
28

これらの値を設定してみてください。fast-cgi の問題を解決します

fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
于 2012-05-22T06:51:19.013 に答える
11

私はこのような調整をすべて行いましたが、ときどき 501/502 エラーが発生していました (毎日)。

これは、501 および 502 nginx エラーを回避するための /etc/php5/fpm/pool.d/www.conf の設定です... サーバーには 16Gb の RAM がありますこの構成は 8Gb RAM サーバー用なので…</p>

sudo nano /etc/php5/fpm/pool.d/www.conf

次に、次の値を設定します

pm.max_children = 70
pm.start_servers = 20
pm.min_spare_servers = 20
pm.max_spare_servers = 35
pm.max_requests = 500

この変更の後、php-fpm を再起動します。

sudo service php-fpm restart
于 2015-12-22T00:58:46.780 に答える
3

サービスであることを忘れないでくださいphp-fpm。インストールしたら、必ず起動してください。

# service php-fpm start
# chkconfig php-fpm on
于 2014-06-11T06:45:17.613 に答える
2

この問題の根底にたどり着くのに苦労している他の人のために、Unixソケットの使用をやめたくなかったので、提案されたようにタイムアウトを調整しようとしました...多くのトラブルシューティングを行い、あまり進んでいない後、この問題が原因であることがわかりました数か月前に php-fpm で有効にした APC 拡張機能によるものです。この拡張機能を無効にすると、断続的な 502 エラーが解決されました。これを行う最も簡単な方法は、次の行をコメントアウトすることでした。

;extension = apc.so

これは私にとってはうまくいきました!

于 2015-06-23T18:40:52.943 に答える
1

ポートは 5.4 で 9001 に変更されました。nginx conf と php-fpm 構成でポートを 9000 から 9001 に変更するだけでうまくいきました。

于 2013-08-04T07:07:25.127 に答える
1

このヒントが誰かの命を救うことを願っています。私の場合、問題はメモリが不足していたことでしたが、ほんのわずかですが、それについて考えるのは困難でした. それに3時間を無駄にした。実行することをお勧めします:

sudo htop

また

sudo free -m

...サーバーで問題のあるリクエストを実行して、メモリが不足していないかどうかを確認します。そして、私の場合のように、スワップファイルを作成する必要があります (まだ持っていない場合)。

このチュートリアルに従って、Ubuntu Server 14.04 でスワップ ファイルを作成しましたが、問題なく動作しました: http://www.cyberciti.biz/faq/ubuntu-linux-create-add-swap-file/

于 2015-02-12T15:37:07.620 に答える
0

また、json_encoded() データを MySQL に書き込むときに、このエラーが発生する可能性があることもわかりました。それを回避するために、JSON を base64_encode() します。デコードすると、JSON エンコーディングによって値が変わる可能性があることに注意してください。注意 24 は 24.00 になる可能性があります

于 2015-11-09T22:53:50.757 に答える
0

Web上のすべてのソリューションを試した後、非常に単純な方法を使用して問題を特定しました。最初にphp-fpmエラーログをチェックしました

cat /var/log/php5-fpm.log 

そして、最も繰り返されたエラーは

" WARNING: [pool www] server reached pm.max_children setting (5), consider raising it "

PHP-fpm プール設定を編集します

nano /etc/php5/fpm/pool.d/www.conf

この行を変更しました

pm.max_children = 5

新しい価値へ

pm.max_children = 10

ところで、私は 128MB の RAM でローエンドの VPS を使用しています。他のみんなと同じように、再利用pm.max_childrenするとサーバーの実行が速くなり、メモリの消費量が少なくなると考えていましたが、使用している設定が低すぎて、PHP-fpm プロセスを開始することさえできませんでした。24時間のテストと失敗の後にこれを見つけたので、これが他の人に役立つことを願っています.私のウェブホストサポートは問題を解決できませんでした.

于 2016-04-29T15:39:50.153 に答える
0

Nginx の設定をいじる前に、まず ChromePHP を無効にしてみてください。

1 - app/config/config_dev.yml を開く

2 - 次の行にコメントを付けます。

chromephp:
    type:   chromephp
    level:  info

ChromePHP は、X-ChromePhp-Data ヘッダーに json エンコードされたデバッグ情報をパックします。これは、fastcgi を使用する nginx のデフォルト構成には大きすぎます。

于 2017-08-17T14:33:29.077 に答える