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

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

ただいまの
回答率

90.40%

  • Ruby

    8496questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    7916questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • CentOS

    2887questions

    CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

  • nginx

    929questions

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

  • Capistrano

    118questions

    Rubyで書かれたサーバオーケストレーションで、複数のサーバでスクリプトを実行する際に用いられます。主な使用用途はWebアプリケーションのデプロイメントです。 アプリケーションのバージョンアップ自動化、およびデータベースの変更などもできます。

【Rails】デプロイ後にサイトを見ると502Bad Gatewayと表示されてしまいます。 エラーの解決方法について教えてください ( NginxとUnicorn、Capistranoを使用)

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,617

yamatora

score 7

Capistranoを用いてRails appをデプロイした後にサイトを見ると
502 Bad Gatewayと表示されてしまいます。

ログには下記が記録されていました。

packet_write_wait: Connection to [IPアドレス]: Broken pipe1: Connection refused) while connecting to upstream

エラーの解消方法を教えてください。

環境

  • CentOS7
  • ruby (2.2.3p173)
  • Rails (5.0.0)
  • unicorn
  • nginx (1.11.1)
  • Capistrano

現在の確認済み事項
config/unicorn/staging.rb の
listenの参照先(/var/www/vhosts/mydomain/shared/tmp/sockets/unicorn.sock)と
nginxのupstreamの参照先(var/www/vhosts/mydomain/shared/tmp/sockets/unicorn.sock)が一致していることは確認済みです。

何か他にも必要な情報がございましたら
追記していきますので、どうか助言をよろしくお願い致します

ソース
config/unicorn/staging.rb

app_path = '/var/www/vhosts/mydomain'

worker_processes 2
working_directory "#{app_path}" + "/current"

# This loads the application in the master process before forking
# worker processes
# Read more about it here:
# http://unicorn.bogomips.org/Unicorn/Configurator.html
preload_app true

timeout 30

# This is where we specify the socket.
# We will point the upstream Nginx module to this socket later on
listen "#{app_path}/shared/tmp/sockets/unicorn.sock", :backlog => 64

pid "#{app_path}/shared/tmp/pids/unicorn.pid"

# Set the path of the log files inside the log folder of the testapp
stderr_path "#{app_path}/current/log/unicorn.stderr.log"
stdout_path "#{app_path}/current/log/unicorn.stdout.log"

before_exec do |server|
  ENV['BUNDLE_GEMFILE'] = "#{app_path}/current/Gemfile"
end

before_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!
  # Before forking, kill the master process that belongs to the .oldbin PID.
  # This enables 0 downtime deploys.
  old_pid = "#{app_path}/shared/tmp/pids/unicorn.pid.oldbin"
  if File.exists?(old_pid) && server.pid != old_pid
    begin
      sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
      Process.kill(sig, File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
      # someone else did our job for us
    end
  end
  sleep 1
end

after_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end

/etc/nginx/nginx.conf

#user  nginx;
worker_processes  1;

include /etc/nginx/modules.conf.d/*.conf;

events {
    worker_connections  1024;
}


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

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;

    keepalive_timeout  65;

    #tcp_nodelay        on;

    #gzip  on;
    #gzip_disable "MSIE [1-6]\.(?!.*SV1)";

    server_tokens off;

    include /etc/nginx/conf.d/*.conf;
}

# override global parameters e.g. worker_rlimit_nofile
include /etc/nginx/*global_params;

nignx.confのhttp内のブロックからincludeされています
/etc/nginx/conf.d/app_nginx.conf

upstream unicorn_server {
    server unix:/var/www/vhosts/mydomain/shared/tmp/sockets/unicorn.sock
    fail_timeout=0;
}

server {
    listen 80;
    client_max_body_size 4G;
    server_name mydomain;

    keepalive_timeout 5;

    # Location of our static files
    root /var/www/vhosts/mydomain/shared/public;
    access_log /var/log/nginx/app_access.log;
    error_log /var/log/nginx/app_error.log;
    location ~ ^/assets/ {
        root /var/www/vhosts/mydomain/shared/public;
    }

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass https://unicorn_server;
    }

    error_page 500 502 503 504 /500.html;
    location = /500.html {
        root /var/www/vhosts/mydomain/shared/public;
    }
}

回答のご指摘から単独でアクセスできるか確認してみました。
unicorn/staging.rb に書きを追記しました。

listen 8080, :tcp_nopush => true


また回答でいただいたサンプルをもとに
/etc/nginx/conf.d/app_nginx.conf を以下のように変更しました。

upstream default_server {
  server mydomain;
}

server {
  listen 8080;
  client_max_body_size 4G;
  server_name mydomain;

  keepalive_timeout 5;
  # Location of our static files
  root /var/www/vhosts/mydomain/shared/public;
  access_log /var/log/nginx/app_access.log;
  error_log /var/log/nginx/app_error.log;

  ssl on;
  ssl_certificate /etc/pki/tls/certs/mydomain_combined.crt;
  ssl_certificate_key /etc/pki/tls/private/mydomain.key;
  ssl_session_timeout 10m;
  ssl_protocols SSLv2 SSLv3 TLSv1;
  ssl_ciphers HIGH:!aNULL:!MD5;
  ssl_prefer_server_ciphers on;

  proxy_buffers 300;
  proxy_max_temp_file_size 300;
  proxy_temp_path /dev/shm/nginx_proxy_temp;
  proxy_connect_timeout 3;
  proxy_send_timeout 3;
  proxy_read_timeout 3;

  location / {
    try_files $uri $uri/ @app
  }

  location @default_server {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass https://var/www/vhosts/mydomain/shared/tmp/sockets/unicorn.sock;
   }

   error_page 500 502 503 504 /500.html;
   location = /500.html {
     root /var/www/vhosts/mydomain/shared/public;
   }

その後
nginxをstartし

telnetコマンドでポートが開いているか確認しました。

Mac:~ user$ telnet IPアドレス 8080
Trying IPアドレス...
Connected to mudomain.
Escape character is '^]'.
^]
telnet> quit
Connection closed.

最後に ping IPアドレス したところ以下のように出力されました

Mac:~ user$ ping IPアドレス
PING IPアドレス (IPアドレス): 56 data bytes
64 bytes from IPアドレス: icmp_seq=0 ttl=56 time=16.244 ms
64 bytes from IPアドレス: icmp_seq=1 ttl=56 time=9.381 ms
64 bytes from IPアドレス: icmp_seq=2 ttl=56 time=9.856 ms
64 bytes from IPアドレス: icmp_seq=3 ttl=56 time=7.853 ms
64 bytes from IPアドレス: icmp_seq=4 ttl=56 time=8.616 ms
^C
--- IPアドレス ping statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 7.853/10.390/16.244/3.005 ms
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

0

初めまして。
リバースプロキシの記載がありますが、単独でアクセスできてますか?

・アクセスできていない

portが開いていない。
unicorn側の設定が悪い。

・アクセスできている

nginxの設定が悪い

まず原因がどこなのか分けた方が回答がつきやすいと思います。
あとドキュメントルートの記載は初めのサーバーディレクティブ内の一箇所だけであとの部分は不要ですよ

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/07 09:24 編集

    ご回答ありがとうございます。
    インフラ周りは知識も経験も乏しいため、初歩的な質問になってしまうのですが、
    単独でアクセスするにはどのようにすればよいでしょうか?
    リバースプロキシの記述は以下になると思うのですが、単純にこの記述を抜けばよいという訳ではありませんか?
    location / {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass https://unicorn_server;
    }

    また、こちらで調査を続行していて気付いたのですが、nginxでssl対応していませんでした。
    現在httpsで対応しているものの、app_nginx..confで特に
    設定をしていなかったので、そちらの対処をしています。

    キャンセル

0

Railsやunicornを使用したことないので適切な回答はできないのですが、

upstream 任意の名前 {
server ドメイン名;
}


app_nginx.conf の一番上に記載されているupstreamディレクティブなのですが、
こちらは他で立ち上げてるサーバーをnginxで読み込んで、locationディレクティブ内にproxy_passを書くことでリダイレクトをかけています。

単独アクセスはcurlコマンドやpingコマンドなどで確認できます。
確認する際はunicornでportが設定されている?と思いますので、そのポートを弾かないようにcentOSのファイアーウォールを開いてください。

また今の環境に合うか分かりませんがRails&unicorn用のサンプルコンフィグファイルがあったので貼っておきます。

/etc/nginx/conf.d/app_nginx.conf 

server {
server_name 任意のドメイン;
root /home/app/rails-app-unicorn/public;

proxy_buffers 任意の値;
proxy_max_temp_file_size 任意の値;
proxy_temp_path /dev/shm/nginx_proxy_temp;
proxy_connect_timeout 任意の値;
proxy_send_timeout 任意の値;
proxy_read_timeout 任意の値;

access_log /var/log/nginx/app_access.log;
error_log /var/log/nginx/app_error.log;

location / {
  try_files $uri $uri/ @app
  }

location @app{
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header Host $http_host;
  proxy_redirect off;
  proxy_pass http://unix:/var/www/vhosts/mydomain/shared/tmp/sockets/unicorn.sock
  }
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/08 06:51

    ご回答ありがとうございます。
    ご指摘いただいたことを試してみました。質問の下に調査内容と結果を追記いたしましたので、お時間ございますときに読んでいただけますと幸いです。

    pingしたところ接続されているみたいなので、アクセスはできているのではないかと思っております。

    キャンセル

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

  • Ruby

    8496questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    7916questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • CentOS

    2887questions

    CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

  • nginx

    929questions

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

  • Capistrano

    118questions

    Rubyで書かれたサーバオーケストレーションで、複数のサーバでスクリプトを実行する際に用いられます。主な使用用途はWebアプリケーションのデプロイメントです。 アプリケーションのバージョンアップ自動化、およびデータベースの変更などもできます。

  • トップ
  • Rubyに関する質問
  • 【Rails】デプロイ後にサイトを見ると502Bad Gatewayと表示されてしまいます。 エラーの解決方法について教えてください ( NginxとUnicorn、Capistranoを使用)