PHP-FPMとNginx。502 不正なゲートウェイ
質問
設定方法
- Ubuntu サーバー 11.10 64 ビット
- Amazon AWS、Ec2、クラウド上でホストされています。
- t1.micro インスタンス
これ以上何かを書く前に、私は両方の nginx 502 Bad Gateway と Nginx + PHP-FPM 502 バッドゲートウェイ のスレッドがありますが、残念ながらこの点では役に立ちませんでした。
この問題はかなり一般的なようです。nginx または php-fpm の誤った設定によって
502 Bad Gateway
エラーが発生します。これは
ドメイン ルートに移動しても
特定のディレクトリを指定せずに、ドメイン ルートに行っても表示されます。
Amazon EC2のWebサーバーを動かしていて、9000番ポートを有効にして、80番ポートを開放するなどしています。
特に質問したいのは、どうすればこの厄介なエラーを取り除くことができるのか、ということです。あるいは、よりよい方法として、どうすれば
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;
}
}
どのように解決するのですか?
もし誰かが私と同じ問題に遭遇してこのページを見つけたなら、私は答えを見つけました。 ここで .
自分でクリックして解決するのが面倒な人のために... ;)
条件です。
Ubuntu または Debian サーバーで、NGINX と PHP 5.3 は問題なく動作していますが、PHP を 5.4 にアップグレードすると 502 Bad Gateway エラーが発生します。ポート 9000 で動作しているサービスを探している (通常、ポート 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の設定( ここで ):
# 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
注意
置き換える
~ ^/(app|app_dev)\.php(/|$) {
を
~ ^/index\.php(/|$) {
SF2でない場合は**。
これで誰かの時間が少しでも減らせるといいのですが :)
編集
もちろん
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 で待ち受けるのではなく、ソケット経由で実行されるように変更された理由があると考えるべきでしょう。
編集2
まだ 502 エラーが発生している場合は、以下を参照してください。 答え .
関連
-
[解決済み】++と*+の意味は何ですか?
-
[解決済み】mysqli_result クラスのオブジェクトを文字列に変換できない
-
[解決済み】XAMPPエラー: www.example.com:443:0 サーバー証明書に、サーバー名と一致するIDが含まれていません。
-
[解決済み] $wpdb->update または $wpdb->insert を実行すると、引用符の前にスラッシュが追加される
-
[解決済み】子テーマのCSSが親テーマをオーバーライドしない
-
[解決済み】PHPのクラスが見つからないが、インクルードされている
-
[解決済み】MySQLのカラム数が1行目の値数と一致しない【非公開
-
[解決済み] PHP product.php?id=1 のような URL を作成する方法
-
[解決済み] mysql_field_nameを新しいmysqliに変更します。
-
[解決済み] PHPでHTML/XMLをパースして処理する方法とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】PHP 7.2 - Warning: count(): パラメータは配列かCountableを実装したオブジェクトでなければならない [解決済み]
-
[解決済み] SQLSTATE[HY093]: 無効なパラメータ番号: バインドされた変数の数が102行目のトークンの数と一致しない [終了]
-
[解決済み】Apache + PHPで「ヘッダの前にスクリプトの出力が終了する」件
-
[解決済み】Xampp ローカルホスト/ダッシュボード
-
[解決済み】Phpのincludeが機能しない? 関数がincludeされない
-
[解決済み】Chrome net::ERR_INCOMPLETE_CHUNKED_ENCODING エラーが発生しました。
-
[解決済み】子テーマのCSSが親テーマをオーバーライドしない
-
[解決済み】警告:mysql_fetch_array()はパラメータ1がリソースであることを期待、ブール値は[重複]で与えられる]
-
[解決済み] $_SERVER['DOCUMENT_ROOT'] と $_SERVER['HTTP_HOST'] の違いについて
-
[解決済み】nginx エラー php5-fpm.sock への接続に失敗しました (13: Permission denied)