質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

21999閲覧

Nginxで502 Bad Gatewayエラーが発生

chapter

総合スコア36

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2016/09/18 17:03

編集2016/09/19 03:40

いつもお世話になっております。

標記の件につきまして、これまで特に問題なくアクセスできていたのですが、
突然502 Bad Gatewayエラーが発生するようになってしまいました。

エラーログには以下のように出力されております。

Bash

1/var/log/nginx/error.log 2 3[error] 17588#17588: *9 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: XXX.XXX.XXX.XXX, server: sample.com, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "sample.com"

環境としましては、CentOS6.7上でnginxとphp-fpmを利用しており、
cakePHP2を利用してウェブアプリを開発しています。

Bash

1# cat /etc/redhat-release 2CentOS release 6.7 (Final) 3 4# nginx -v 5nginx version: nginx/1.10.0 6 7# php-fpm -v 8PHP 5.5.35 (fpm-fcgi) (built: Apr 27 2016 14:53:24) 9Copyright (c) 1997-2015 The PHP Group 10Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies 11 with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies

nginx導入時にも502 Bad Gatewayエラーが出たことがあり、
いろいろなサイトを参考にタイムアウトの設定などを追加して
解消した経緯があり、その後はずっと問題なくアクセスできていました。

現在の設定ファイルは以下のようになっています。

Bash

1# cat /etc/nginx/nginx.conf 2 3user nginx; 4worker_processes 1; 5 6error_log /var/log/nginx/error.log warn; 7pid /var/run/nginx.pid; 8 9 10events { 11 worker_connections 1024; 12 use epoll; 13} 14 15 16http { 17 include /etc/nginx/mime.types; 18 default_type application/octet-stream; 19 20 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 21 '$status $body_bytes_sent "$http_referer" ' 22 '"$http_user_agent" "$http_x_forwarded_for"'; 23 24 access_log /var/log/nginx/access.log main; 25 26 sendfile on; 27 tcp_nopush on; 28 tcp_nodelay on; 29 30 keepalive_timeout 0; 31 32 server_tokens off; 33 server_name_in_redirect off; 34 35 gzip on; 36 gzip_disable "msie6"; 37 gzip_vary on; 38 gzip_proxied any; 39 gzip_comp_level 6; 40 gzip_min_length 1024; 41 gzip_types text/plain 42 text/xml 43 text/css 44 application/xml 45 application/xhtml+xml 46 application/rss+xml 47 application/atom_xml 48 application/json 49 application/javascript 50 application/x-javascript; 51 52 fastcgi_intercept_errors on; 53 fastcgi_ignore_client_abort off; 54 fastcgi_buffer_size 256k; 55 fastcgi_buffers 8 512k; 56 fastcgi_busy_buffers_size 512k; 57 fastcgi_temp_file_write_size 512k; 58 59 fastcgi_connect_timeout 600s; 60 fastcgi_send_timeout 600s; 61 fastcgi_read_timeout 600s; 62 send_timeout 600; 63 64 server { 65 listen 80 default_server; 66 server_name _; 67 return 444; 68 } 69 70 server { 71 location /favicon { 72 empty_gif; 73 access_log off; 74 log_not_found off; 75 } 76 77 location @favicon { 78 empty_gif; 79 access_log off; 80 log_not_found off; 81 } 82 } 83 84 include /etc/nginx/conf.d/*.conf; 85 include /etc/nginx/conf.d/vhost/*.conf; 86}

Bash

1# cat /etc/nginx/conf.d/default.conf 2 3server { 4 listen 80; 5 server_name localhost; 6 7 index index.html index.htm index.php; 8 set $root_path '/var/www/html'; 9 root $root_path; 10 11 location / { 12 root $root_path; 13 } 14 15 error_page 500 502 503 504 /50x.html; 16 location = /50x.html { 17 root /usr/share/nginx/html; 18 } 19 20 location ~ \.php$ { 21 root $root_path; 22 fastcgi_pass 127.0.0.1:9000; 23 fastcgi_index index.php; 24 fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name; 25 include fastcgi_params; 26 } 27 28 location ~ /\.ht { 29 deny all; 30 } 31}

Bash

1# cat /etc/nginx/conf.d/vhost/sample.com.conf 2 3server { 4 listen 80; 5 server_name sample.com; 6 7 index index.html index.htm index.php; 8 set $root_path '/var/www/html/APP_DIR/app/webroot'; 9 root $root_path; 10 11 location / { 12 if (!-e $request_filename) { 13 rewrite ^(.+)$ /index.php?url=$1 last; 14 break; 15 } 16 } 17 18 location ~ \.php$ { 19 fastcgi_pass 127.0.0.1:9000; 20 fastcgi_index index.php; 21 fastcgi_intercept_errors on; 22 include fastcgi_params; 23 fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name; 24 fastcgi_param SERVER_NAME $host; 25 } 26 27 location ~* ^/(css|img|js|font)/(.+)$ { 28 root $root_path; 29 } 30 31 location ~ /\.ht { 32 deny all; 33 } 34}

こちらの設定にした後は、502 Bad Gatewayエラーは出なくなっていたのですが、
今回サーバを停止させ、別のDBサーバで構築しているMySQLのテーブル構成を見直して、
再起動させたところ、502 Bad Gatewayエラーが出るようになってしまいました。

nginxに関連する設定は変更していなかったので、DBサーバのテーブル構成は
エラーが出る前の状態に戻してから再起動してみましたが、
502 Bad Gatewayエラーは解消されませんでした。


【icchiiさんのアドバイスにより以下追記】

改めて詳細をチェックしてみると、データベースに接続するページのみ
502が出ておりました。

基本的には全てのページでログインを必須としており、ログイン時に
データベースに登録されているユーザー情報と一致しているかチェックし、
その後はセッションでログイン状態を保持して、ログインしていない場合は
ログインページを表示しておりますが、ログインページではデータベース
にはアクセスしていないためか、正常に表示されておりました。

その後、ログイン処理を行って、ユーザー情報がデータベースの情報と一致するか
チェックする際にデーターベースに接続しますが、その時点でしばらく時間が
経った後に502が出ております。
(ログインできない状態のため、全てのページは確認できておりません)

また、ブラウザアクセス以外で、CRONでデータベースに接続する処理を
いくつか回しておりますが、こちらの方は正常に処理はできております。

今回問題が発生しているウェブサーバ上から直接、DBサーバ上のMySQLに
接続してみましたが、特に遅延なくデータは表示できました。

ブラウザでアクセスして、データベースに接続する処理の場合のみ、
一定時間内にレスポンスを返せなくて502が発生しているようです。


上記を踏まえまして、何か解決のヒントになるようなことがございましたら、
ご教授いただけると助かります。

それでは、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

popobot

2016/09/18 22:20 編集

502 Bad Gatewayって、一定時間内にCakephp側がレスポンスを返せなくて、Nginxが時間切れになるとよく見かけます。もう少し前提が知りたいですが、すべてのページへのアクセスが502なのでしょうか。502は常にでているのでしょうか。ブラウザでアクセスすると一瞬で502が表示されるのでしょうか。サーバ側の負荷はかかっていないということでしょうか。Cakephpはすぐに結果を返しているのでしょうか。
chapter

2016/09/19 03:36

icchiiさん、ご助言ありがとうございます。 改めて詳細をチェックしてみると、データベースに接続するページのみ 502が出ておりました。 基本的には全てのページでログインを必須としており、ログイン時に データベースに登録されているユーザー情報と一致しているかチェックし、 その後はセッションでログイン状態を保持して、ログインしていない場合は ログインページを表示しておりますが、ログインページではデータベース にはアクセスしていないためか、正常に表示されておりました。 その後、ログイン処理を行って、ユーザー情報がデータベースの情報と一致するか チェックする際にデーターベースに接続しますが、その時点でしばらく時間が 経った後に502が出ております。 (ログインできない状態のため、全てのページは確認できておりません) また、ブラウザアクセス以外で、CRONでデータベースに接続する処理を いくつか回しておりますが、こちらの方は正常に処理はできております。 今回問題が発生しているウェブサーバ上から直接、DBサーバ上のMySQLに 接続してみましたが、特に遅延なくデータは表示できました。 ブラウザでアクセスして、データベースに接続する処理の場合のみ、 一定時間内にレスポンスを返せなくて502が発生しているようです。
popobot

2016/09/19 03:59

ユーザー情報がデータベースの情報と一致するかチェックするSQLは、直接実行すると早いのでしょうか? MySQLのスローログとかを見て、遅いSQLにないですか?
chapter

2016/09/19 07:14

icchiiさん、ご返信ありがとうございます。 直接実行すると0.1秒も掛からないで結果が返ってきます。 ただ、ログイン後に表示される画面では、ページ表示のために他のテーブルにもアクセスしているので、スローログを元に時間が掛かっている処理を見直したところ、正常に表示されるようになりました。 これまでは問題なかったので、原因はSQLの処理ではないと思いこんでしまっていましたが、icchiiさんのアドバイスのお陰で、原因が特定できました。 ありがとうございます。
popobot

2016/09/19 07:20

うまくいってよかったです! 回答し忘れましたね...あとで調査のコツでも回答しておこうかな...
guest

回答1

0

ベストアンサー

502 Bad Gatewayは、一定時間内にアプリ側がレスポンスを返せなくて、Nginxが時間切れになるとよく見かけます。時間切れになる主な要因は以下の2つあります。

  • アクセスの集中による負荷増加

これはユーザからのリクエストが急激に増え、全体的に負荷が増加した結果、時間切れになります。アクセスログやサーバ側のランキューやMySQLのproresslists等を見て、アクセス数や処理が遅延を確認すれば特定できます。
一時的な増加であれば、そのうち沈静化しますが、頻度が多いようなら、サーバ増強や全体的なパフォチュが必要になります。

  • PHPやSQLによる負荷増加

これは何らかの修正が悪影響を及ぼし、想定外の負荷が発生しておこります。特定の処理だけ502を返す場合などは可能性が高いです。該当処理の直近の修正履歴を見たり、MySQLのスローログなどを確認したり、ログ出力等で時間がかかっている処理を特定して原因を特定する必要があります。経験上だいたいはSQLに時間がかかるケースが多いです。SQLはちょっとした修正ですごく遅くなったりしますので...

投稿2016/09/19 07:41

popobot

総合スコア6586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chapter

2016/09/19 10:06

icchiiさん、ご回答ありがとうございました。 お陰さまで無事に解決しました! 調査方法についてのアドバイスもありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問