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

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

ただいまの
回答率

90.40%

  • PHP

    24949questions

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

  • nginx

    1067questions

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

Nginxで502 Bad Gatewayエラーが発生

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 10K+

chapter

score 28

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

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

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

/var/log/nginx/error.log

[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を利用してウェブアプリを開発しています。

# cat /etc/redhat-release
CentOS release 6.7 (Final)

# nginx -v
nginx version: nginx/1.10.0

# php-fpm -v
PHP 5.5.35 (fpm-fcgi) (built: Apr 27 2016 14:53:24)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies

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

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

# cat /etc/nginx/nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections 1024;
    use epoll;
}


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

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;

    keepalive_timeout  0;

    server_tokens     off;
    server_name_in_redirect  off;

    gzip  on;
    gzip_disable      "msie6";
    gzip_vary         on;
    gzip_proxied      any;
    gzip_comp_level   6;
    gzip_min_length   1024;
    gzip_types        text/plain
                      text/xml
                      text/css
                      application/xml
                      application/xhtml+xml
                      application/rss+xml
                      application/atom_xml
                      application/json
                      application/javascript
                      application/x-javascript;

    fastcgi_intercept_errors  on;
    fastcgi_ignore_client_abort  off;
    fastcgi_buffer_size 256k;
    fastcgi_buffers 8 512k;
    fastcgi_busy_buffers_size  512k;
    fastcgi_temp_file_write_size  512k;

    fastcgi_connect_timeout 600s;
    fastcgi_send_timeout 600s;
    fastcgi_read_timeout 600s;
    send_timeout 600;

    server {
        listen       80  default_server;
        server_name  _;
        return       444;
    }

    server {
        location /favicon {
            empty_gif;
            access_log    off;
            log_not_found off;
        }

        location @favicon {
            empty_gif;
            access_log    off;
            log_not_found off;
        }
    }

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/conf.d/vhost/*.conf;
}
# cat /etc/nginx/conf.d/default.conf

server {
    listen       80;
    server_name  localhost;

    index  index.html index.htm index.php;
    set $root_path '/var/www/html';
    root $root_path;

    location / {
        root   $root_path;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location ~ \.php$ {
        root           $root_path;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $root_path$fastcgi_script_name;
        include        fastcgi_params;
    }

    location ~ /\.ht {
        deny  all;
    }
}
# cat /etc/nginx/conf.d/vhost/sample.com.conf

server {
    listen       80;
    server_name  sample.com;

    index  index.html index.htm index.php;
    set $root_path '/var/www/html/APP_DIR/app/webroot';
    root $root_path;

    location / {
        if (!-e $request_filename) {
            rewrite ^(.+)$  /index.php?url=$1 last;
            break;
        }
    }

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_intercept_errors on;
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $root_path$fastcgi_script_name;
        fastcgi_param  SERVER_NAME      $host;
    }

    location ~* ^/(css|img|js|font)/(.+)$ {
        root $root_path;
    }

    location ~ /\.ht {
        deny  all;
    }
}

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

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


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

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

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

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

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

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

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


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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • popobot

    2016/09/19 12:59

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

    キャンセル

  • chapter

    2016/09/19 16:14

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

    キャンセル

  • popobot

    2016/09/19 16:20

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

    キャンセル

回答 1

checkベストアンサー

0

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

  • アクセスの集中による負荷増加
    これはユーザからのリクエストが急激に増え、全体的に負荷が増加した結果、時間切れになります。アクセスログやサーバ側のランキューやMySQLのproresslists等を見て、アクセス数や処理が遅延を確認すれば特定できます。
    一時的な増加であれば、そのうち沈静化しますが、頻度が多いようなら、サーバ増強や全体的なパフォチュが必要になります。
  • PHPやSQLによる負荷増加
    これは何らかの修正が悪影響を及ぼし、想定外の負荷が発生しておこります。特定の処理だけ502を返す場合などは可能性が高いです。該当処理の直近の修正履歴を見たり、MySQLのスローログなどを確認したり、ログ出力等で時間がかかっている処理を特定して原因を特定する必要があります。経験上だいたいはSQLに時間がかかるケースが多いです。SQLはちょっとした修正ですごく遅くなったりしますので...

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/19 19:06

    icchiiさん、ご回答ありがとうございました。

    お陰さまで無事に解決しました!

    調査方法についてのアドバイスもありがとうございます。

    キャンセル

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

  • ただいまの回答率 90.40%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • PHP

    24949questions

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

  • nginx

    1067questions

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