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

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

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

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

Ruby

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

nginx

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

Ruby on Rails

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

Capistrano

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

Q&A

2回答

8306閲覧

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

yamatora

総合スコア17

CentOS

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

Ruby

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

nginx

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

Ruby on Rails

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

Capistrano

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

0グッド

0クリップ

投稿2016/09/05 13:27

編集2022/01/12 10:55

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

ruby

1app_path = '/var/www/vhosts/mydomain' 2 3worker_processes 2 4working_directory "#{app_path}" + "/current" 5 6# This loads the application in the master process before forking 7# worker processes 8# Read more about it here: 9# http://unicorn.bogomips.org/Unicorn/Configurator.html 10preload_app true 11 12timeout 30 13 14# This is where we specify the socket. 15# We will point the upstream Nginx module to this socket later on 16listen "#{app_path}/shared/tmp/sockets/unicorn.sock", :backlog => 64 17 18pid "#{app_path}/shared/tmp/pids/unicorn.pid" 19 20# Set the path of the log files inside the log folder of the testapp 21stderr_path "#{app_path}/current/log/unicorn.stderr.log" 22stdout_path "#{app_path}/current/log/unicorn.stdout.log" 23 24before_exec do |server| 25 ENV['BUNDLE_GEMFILE'] = "#{app_path}/current/Gemfile" 26end 27 28before_fork do |server, worker| 29 defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect! 30 # Before forking, kill the master process that belongs to the .oldbin PID. 31 # This enables 0 downtime deploys. 32 old_pid = "#{app_path}/shared/tmp/pids/unicorn.pid.oldbin" 33 if File.exists?(old_pid) && server.pid != old_pid 34 begin 35 sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU 36 Process.kill(sig, File.read(old_pid).to_i) 37 rescue Errno::ENOENT, Errno::ESRCH 38 # someone else did our job for us 39 end 40 end 41 sleep 1 42end 43 44after_fork do |server, worker| 45 defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection 46end

/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 に書きを追記しました。

ruby

1listen 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

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

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

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

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

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

guest

回答2

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/07 03:40

minehan

総合スコア170

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

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

yamatora

2016/09/07 21:51

ご回答ありがとうございます。 ご指摘いただいたことを試してみました。質問の下に調査内容と結果を追記いたしましたので、お時間ございますときに読んでいただけますと幸いです。 pingしたところ接続されているみたいなので、アクセスはできているのではないかと思っております。
guest

0

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

portが開いていない。
unicorn側の設定が悪い。
・アクセスできている

nginxの設定が悪い

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

投稿2016/09/06 02:00

minehan

総合スコア170

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

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

yamatora

2016/09/07 00:29 編集

ご回答ありがとうございます。 インフラ周りは知識も経験も乏しいため、初歩的な質問になってしまうのですが、 単独でアクセスするにはどのようにすればよいでしょうか? リバースプロキシの記述は以下になると思うのですが、単純にこの記述を抜けばよいという訳ではありませんか? 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で特に 設定をしていなかったので、そちらの対処をしています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問