🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
unicorn

Unicornは、汎用のRackアプリケーションサーバ。RackとWebサーバーの機能を併せ持ちます。レスポンス処理や、Nginx単体がRackの機能をサポートしていない事から、一般的にはNginx+Unicorn+Railsの構成を取って用います。

nginx

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

Ruby on Rails

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

10245閲覧

upstream prematurely closed connection while reading response header from upstreamが解消できない

tsueken

総合スコア8

unicorn

Unicornは、汎用のRackアプリケーションサーバ。RackとWebサーバーの機能を併せ持ちます。レスポンス処理や、Nginx単体がRackの機能をサポートしていない事から、一般的にはNginx+Unicorn+Railsの構成を取って用います。

nginx

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

Ruby on Rails

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2021/02/27 10:12

本番環境でのデプロイ完了後にブラウザで開くと
assetsディレクトリのファイルが読み込めず、
以下のように「502 Bad Gateway」となり、正常に動作しません。
ちなみにリロードすると、コンソール上に表示されるエラーの数は変動します。

イメージ説明

nginxのエラーログでは以下のような内容が表示されています。

2021/02/25 10:02:01 [error] 19204#0: *185 upstream prematurely closed connection while reading response header from upstream...

上記エラーと関連性があるのかは分かりませんが、
ALBのヘルスチェックは unhealtyとなっており、
status detailは
「Health checks failed with these codes: [301]」
となっています。


###インフラ環境

  • EC2: t2micro
  • RDS
  • ELB(ALB)
  • nginx: 1.18.0
  • unicorn: 5.8.0
  • capistrano: 3.15.0

###その他環境

  • ruby: 2.6.3
  • Ruby on Rails: 5.2.4.1
  • webpack: 4.44.1

###関連ファイル
config/unicorn.rb

app_path = File.expand_path('../../../', __FILE__) worker_processes 1 timeout 60 working_directory "#{app_path}/current" listen "#{app_path}/shared/tmp/sockets/unicorn.sock" pid "#{app_path}/shared/tmp/pids/unicorn.pid" stderr_path "#{app_path}/shared/log/unicorn.stderr.log" stdout_path "#{app_path}/shared/log/unicorn.stdout.log" preload_app true before_exec do |server| ENV['BUNDLE_GEMFILE'] = "#{app_path}/current/Gemfile" end

/etc/nginx/conf.d/app.conf

proxy_cache_path /var/cache/nginx/rproxy levels=1:2 keys_zone=proxy1:10m inactive=1d; upstream app_server { server unix:/var/www/rails/app/shared/tmp/sockets/unicorn.sock max_fails=1 fail_timeout=10s; keepalive 40; } server { listen 80; server_name ip_addr; set_real_ip_from ip_addr; real_ip_header X-Forwarded-For; real_ip_recursive on; keepalive_timeout 60; root /var/www/rails/app/current/public; try_files $uri $uri/index.html @unicorn; location @unicorn { proxy_http_version 1.1; proxy_set_header Connection ""; proxy_set_header Host $host; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Server $hostname; proxy_set_header X-Real-IP $remote_addr; proxy_redirect off; proxy_connect_timeout 75s; proxy_read_timeout 60s; proxy_send_timeout 60s; proxy_cache proxy1; proxy_cache_bypass $http_authorization $http_cookie; proxy_no_cache $http_authorization $http_cookie; proxy_buffering on; proxy_buffer_size 4k; proxy_buffers 8 4k; proxy_max_temp_file_size 1024m; proxy_busy_buffers_size 8k; proxy_pass http://app_server; } }

試したこと

自分なりに調べた限りでは、
前者のエラーに関連している可能性があるのは、
リバースプロキシとして導入しているnginxとunicornのtimeout関連の設定とプロセス数などが影響していると考えました。

試したこととしては上記のtimeout時間を延長または、プロセス数を減らすなどを試してみましたが、
一向に改善する様子がありませんでした。

何か他に影響している可能性についてご存知の方がいらっしゃいましたらご教示いただけないでしょうか。

宜しくお願い致します。


###参考サイト
Nginx upstream prematurely closed connection while reading response header from upstream, for large requests

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

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

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

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

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

guest

回答1

0

ベストアンサー

ALBのヘルスチェックが失敗しているのなら、そもそもアクセスするべきEC2インスタンスがALB配下に存在していません。

Health checks failed with these codes: [301]

ということは、ALBがEC2インスタンスに送るヘルスチェックのリクエストがリダイレクトされてしまっているということです。
ヘルスチェックはデフォルトの設定では200以外のレスポンスはエラーとみなします
一応200〜400番台のステータスコードはカスタマイズによって一応OKとみなすことができなくもないですが、それは根本的な解決ではないので、どうしてもそうせざるを得ない場合か一時的な検証用途以外はなるべく避けてください。

301リダイレクトを発生させているのはnginxかRailsかわかりませんが(見た感じ恐らくRails?)、ターゲットグループの設定でヘルスチェックのリクエストをどのパスに送るか指定できるので、リダイレクトが発生しないようなパスがあるならそこに向けてヘルスチェックを送るようにしてください。

いずれにせよ、リダイレクトが発生しているところを特定するところからですね。

投稿2021/02/27 14:20

編集2021/02/27 14:20
yu_1985

総合スコア7588

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

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

tsueken

2021/02/27 16:10

yu_1985様 ご回答いただきありがとうございます。 ご指摘いただいた通り、Rails側でリダイレクトが行われていたことが原因でした。 config/production.rbの記述でconfig.force_ssl = trueとしていたことで443へリダイレクトされていたようです。 こちらをconfig.force_ssl = falseにしたところターゲットグループのステータスもhealthyとなり、 同時に502エラーも解消されました。 今回はRailsでの処理が終わる前にリダイレクトされていたことで、 502エラーも生じていたようです。 非常に助かりました。本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問