構成
何かを書く前に、 nginx 502 bad gateway と Nginx + PHP-FPM 502 Bad Gateway の両方のスレッドをチェックしたことを述べたいと思います。この点で私を助けなかった。
問題はかなり一般的であるように見えます:nginxまたはphp-fpmの設定が間違っていると、502 Bad Gateway
エラーが発生する可能性がありますが、これは取り除くことができませんでした。これは、特定のディレクトリを指定せずにドメインルートに移動してもと表示されることに注意してください。
ポート9000を有効にし、ポート80を開いた状態で、Amazon EC2ウェブサーバーを実行しています。
特に問題は、この厄介なエラーをどのように取り除くことができるかということです。または、さらに良いことに、php5-fpm
を実際に動作するにするにはどうすればよいですか。
私がこれまでに試みたもの
構成ファイル、特にphp-fpm.conf
およびnginx.conf
のほとんど一貫した編集。
i。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
を実行しようとすると、無限ループまたは何かであると推測するものにハングアップします。 CTRL-C のうち。
フル構成
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;
}
}
誰かが私と同じ問題に遭遇してこのページを見つけた場合、私は答えを見つけました here 。
クリックして自分で解決することに悩むことができない人のために...;)
条件:
NGINXおよびPHP 5.3を使用するUbuntuまたはDebianサーバーは正常に動作しますが、PHPを5.4にアップグレードすると502 Bad Gatewayエラーが発生します。ポート9000で実行されているサービス(通常netstat -lp
または同様のサービス)を検索しても何も返されません。
修正:
/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設定( here から取得):
# 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.sock
をlisten = 127.0.0.1:9000
の/etc/php5/fpm/pool.d/www.conf
に変更してからphp5-fpmを再起動することもできます(vhostを変更する必要がなくなります)が、php5が変更されたと仮定する必要があります-fpmは、理由によりポート9000でリッスンするのではなく、ソケットを介して実行します。
Edit2
それでも502エラーが発生する場合は、この answer を参照してください。
これらの値を設定してみてください、fast-cgiの問題を解決します
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
このような調整をすべて行いましたが、時々501/502エラーが発生していました(毎日)。
これは/ etc/php5/fpm/pool.d/www.confの私の設定です。501と502のnginxエラーを回避するために…サーバーには16Gb RAMがあります。この構成は8Gb RAMサーバー用であるため…
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
私のようにphp-fpmをアップグレードした後に問題が発生した場合は、これを試してください:/etc/php5/fpm/pool.d/www.confを開いて、次の行のコメントを外します。
listen.owner = www-data
listen.group = www-data
listen.mode = 0666
その後、php-fpmを再起動します。
php-fpm
はサービスであることを忘れないでください。インストールしたら、必ず起動してください。
# service php-fpm start
# chkconfig php-fpm on
これの一番下に到達するのに苦労している他の人のために、私はUnixソケットの使用を停止したくないので提案されたようにタイムアウトを調整しようとしました...多くのトラブルシューティングを行った後、この問題が引き起こされていることがわかりました数か月前にphp-fpmで有効にしたAPC拡張によって。この拡張機能を無効にすると、断続的な502エラーが解決されました。これを行う最も簡単な方法は、次の行をコメントアウトすることでした。
;extension = apc.so
これは私のためにトリックをしました!
ポートは5.4で9001に変更され、nginx confおよびphp-fpm構成でポートが9000から9001に変更されただけでうまくいきました。
このヒントが誰かの命を救うことを願っています。私の場合、問題はメモリを使い果たしたということでしたが、ほんの少しだけそれについて考えるのが困難でした。その上で3時間を無駄にしました。実行することをお勧めします:
Sudo htop
または
Sudo free -m
...サーバーで問題のあるリクエストを実行して、メモリが不足していないかどうかを確認します。そして、私の場合のように、スワップファイルを作成する必要があります(まだ持っていない場合)。
このチュートリアルに従って、Ubuntu Server 14.04でスワップファイルを作成しましたが、うまく機能しました: http://www.cyberciti.biz/faq/ubuntu-linux-create-add-swap-file/
Nginxの設定をいじる前に、まずChromePHPを無効にしてみてください。
chromephp:
type: chromephp
level: info
ChromePHPは、X-ChromePhp-Dataヘッダーにjsonエンコードされたデバッグ情報をパックします。これは、fastcgiを使用したnginxのデフォルト構成には大きすぎます。
私はこのゲームに非常に遅れていますが、サーバー上のphpをアップグレードしたときに問題が始まりました。 .socketファイルを削除して、サービスを再起動することができました。その後、すべてが機能しました。ファイルのサイズが0であり、所有権とアクセス許可が同じであるため、なぜ違いが生じたのかはわかりませんが、うまくいきました。
NGINX vhostファイルのPHPファイル(通常location ~ \.php$ {
)をFastCGIで処理するロケーションブロックで、次の行があることを確認します。
proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
その後、fpmとnginxを再起動することを忘れないでください。
追加:
NGINX仮想ホストパス
/etc/nginx/sites-enabled/
-LinuxNGINXを再起動します:
Sudo service nginx restart
-Linuxbrew service restart nginx
-MacFPMの再起動:
Fpmプロセス名を決定します。-systemctl list-unit-files | grep fpm
-Linux-brew services list | grep php
-Mac
その後、次のコマンドで再起動します。
Sudo service <service-name> restart
-Linuxbrew services restart <service-name>
-Macウェブ上のすべてのソリューションを試した後、非常に簡単な方法を使用して問題を解決しました。最初にphp-fpm err logをチェックしました
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
を再使用すると、サーバーの実行速度が速くなり、メモリの消費量が少なくなります24時間のテストと失敗の後、これを見つけたので、これが他の人を助けることを願っていますが、私のウェブホストサポートは問題を解決できませんでした。
また、json_encoded()データをMySQLに書き込むときにこのエラーが発生することもあります。それを回避するには、JSONをbase64_encode()します。 JSONエンコードによってデコード時に値が変更される可能性があることに注意してください。 Nb。 24は24.00になります
エラーログが表示されます。デフォルトでは、その場所は/var/log/nginx/error.logにあります
私の場合、502は次の理由でうまくいきます。
GET /app_dev.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm.sock:", Host: "symfony2.local"
2016/05/25 11:57:28 [error] 22889#22889: *3 upstream sent too big header while reading response header from upstream, client: 127.0.0.1, server: symfony2.local, request: "GET /app_dev.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm.sock:", Host: "symfony2.local"
2016/05/25 11:57:29 [error] 22889#22889: *3 upstream sent too big header while reading response header from upstream, client: 127.0.0.1, server: symfony2.local, request: "GET /app_dev.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm.sock:", Host: "symfony2.local"
2016/05/25 11:57:29 [error] 22889#22889: *3 upstream sent too big header while reading response header from upstream, client: 127.0.0.1, server: symfony2.local, request: "GET /app_dev.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm.sock:", Host: "symfony2.local"
何が間違っているかを正確に把握したら、修正します。これらのエラーについては、バッファを変更するだけです:
fastcgi_buffers 16 512k;
fastcgi_buffer_size 512k;