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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

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

nginx

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

Q&A

解決済

2回答

4552閲覧

リダイレクトループの原因がわからないので教えていただけないでしょうか?

koume

総合スコア458

Ruby on Rails 5

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

nginx

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

1グッド

1クリップ

投稿2019/05/15 20:01

過去に同じような質問をさせていただきましたが、自分なりに調べてコードを記述、修正しては別のエラーが発生し、また調べて・・・を何十回もくりかえしてきましたが、どうやらこのエラーを解決しなければ前進しないようです。

どなたか詳しい方、お助けください。おねがいします。

さくらのVPS+Rails5+Nginx+unicornで デプロイしました。
数え切れないくらいのエラーをなんとか解決してきましたが、無限ループのような現象が起きてはまってしまいました。
Nginxとunicornの起動の確認はOKです。

このページは動作していません XXXX-XXXX.com でリダイレクトが繰り返し行われました。 Cookie を消去してみてください. ERR_TOO_MANY_REDIRECTS

※ Cookieを消去しても変化はありません。

/var/log/nginx/error.logを見ると 2019/05/16 03:35:57 [notice] 24454#24454: signal process started で OK みたいです。

しかし,unicorn側のlogにたくさんの301アクセス記録?が表示されていて何回もアクセスに失敗しているみたいです。

log/unicorn.log 155.233.56.54 - - [16/May/2019:03:45:40 +0900] "GET / HTTP/1.0" 301 - 0.0002 155.233.56.54 - - [16/May/2019:03:45:40 +0900] "GET / HTTP/1.0" 301 - 0.0004 155.233.56.54 - - [16/May/2019:03:45:40 +0900] "GET / HTTP/1.0" 301 - 0.0006 155.233.56.54 - - [16/May/2019:03:45:41 +0900] "GET / HTTP/1.0" 301 - 0.0008 155.233.56.54 - - [16/May/2019:03:45:41 +0900] "GET / HTTP/1.0" 301 - 0.0004

Nginxの設定がおかしいのか、unicorn側なのかわからず手が出ない状態になっています。

/etc/nginx/conf.d/https.conf upstream app_server { server unix:/usr/share/nginx/html/current/tmp/sockets/.unicorn.sock fail_timeout=0; } map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen 443 ssl http2; server_name wonder-gate.com; access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; location / { deny 212.64.88.231; deny 181.24.23.164; allow all; root /usr/share/nginx/html/current/public; index index.html index.htm; try_files $uri/index.html $uri.html $uri @app; } ssl_protocols TLSv1.2; ssl_ciphers EECDH+AESGCM:EECDH+AES; ssl_ecdh_curve prime256v1; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_certificate /etc/letsencrypt/live/XXXX-XXXX.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/XXXX-XXXX.com/privkey.pem; proxy_connect_timeout 130; proxy_read_timeout 130; proxy_send_timeout 130; client_max_body_size 2G; error_page 404 /404.html; location = /404.html { root /usr/share/nginx/html/current/public; } error_page 500 502 504 /500.html; location = /500.html { root /usr/share/nginx/html/current/public; } location @app { deny 212.64.88.231; deny 181.24.23.164; allow all; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://app_server; } set $maintenance false; if (-e /var/tmp/do_maintenance) { set $maintenance true; } if ($uri ~ "^/maintenance/") { set $maintenance false; } if ($remote_addr = XXX.XXX.XXX.XX) { set $maintenance false; } error_page 503 /maintenance/maintenance.html; location /maintenance/ { root /var/www; } if ($maintenance = true) { return 503; } }
config/unicorn/production.rb #ワーカーの数。 $worker = 2 #何秒経過すればワーカーを削除するのかを決める $timeout = 30 #自分のアプリケーション名、currentがつくことに注意。 $app_dir = "/usr/share/nginx/html/current" #リクエストを受け取るポート番号を指定。 $listen = File.expand_path 'tmp/sockets/.unicorn.sock', $app_dir $pid = File.expand_path 'tmp/pids/unicorn.pid', $app_dir #PIDの管理ファイルディレクトリi #$pid = File.expand_path 'tmp/pids/unicorn.pid', $app_dir #エラーログを吐き出すファイルのディレクトリ $std_log = File.expand_path 'log/unicorn.log', $app_dir $err_log = File.expand_path 'log/unicorn.log', $app_dir # 上記で設定したものが適応されるよう定義 worker_processes $worker working_directory $app_dir #stderr_path $std_log stderr_path $err_log stdout_path $std_log timeout $timeout listen $listen pid $pid #ホットデプロイをするかしないかを設定 preload_app true root = "/usr/share/nginx/html/current" before_exec do |server| ENV['BUNDLE_GEMFILE'] = "#{root}/Gemfile" end #fork前に行うことを定義。 before_fork do |server, worker| defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect! old_pid = "#{server.config[:pid]}.oldbin" if old_pid != server.pid begin sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU Process.kill :QUIT, File.read(old_pid).to_i rescue Errno::ENOENT, Errno::ESRCH end end end #fork後に行うことを定義。 after_fork do |server, worker| defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection end

この設定でなぜリダイレクトループが起きてしまうのかが、初心者の自分では全く手がでません。

Nginxのファイルをいじって確認してみましたが

try_files $uri/index.html $uri.html $uri @app; で該当するファイルが無くて location @app { }にリダイレクトし
その中のproxy_pass http://app_server;でupstreamブロックで定義したバックエンド(app_server)にリクエストが中継されるという流れになっているとは思っていたのですが、ダメ なようでした。

ここで、無限ループが発生しているのか、それともunicornがリクエストを受け取る部分の

#自分のアプリケーション名、currentがつくことに注意。 $app_dir = "/usr/share/nginx/html/current" #リクエストを受け取るポート番号を指定。 $listen = File.expand_path 'tmp/sockets/.unicorn.sock', $app_dir $pid = File.expand_path 'tmp/pids/unicorn.pid', $app_dir

が悪いのかが見当もつかないのです。自分ではきちんと設定しているつもりなのですが・・・
unicorn側のlogに301アクセスが繰り返される状況なのでunicorn側の設定に問題があるのでしょうか?

また、try_files $uri/index.html $uri.html $uri @app;の記述位置を変える(location @app { }の外に記述する。)と
リダイレクトループからは抜け出せますが、403 Forbiddenが表示されます。

403Forbidden 発生時の /var/log/nginx/error.log 2019/05/13 17:11:40 [error] 10070#10070: *9598 directory index of "/usr/share/nginx/html/current/public/" is forbidden, client: XXX.XXX.XXX.XX, server: panda-hogeapp.com, request: "GET / HTTP/2.0", host: "XXXX-XXXX.com"

また、proxy_pass http://app_server; を https に変えるとWe're sorry, but something went wrong.になり

/var/log/nginx/error.log [error] 18139#18139: *10859 SSL_do_handshake() failed (SSL: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol) while SSL handshaking to upstream, client: 155.233.56.54, server: XXXX-XXXX.com, request: "GET / HTTP/2.0", upstream: "https://unix:/usr/share/nginx/html/current/tmp/sockets/.unicorn.sock:/", host: "XXXX-XXXX.com

この解決におおむね数百時間も費やしているので挫折しそうなのですが、どなたか助けていただけないでしょうか?
宜しくお願いします。

set0gut1👍を押しています

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

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

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

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

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

CHERRY

2019/05/15 21:55 編集

nginx を使わないで、unicorn のポートに直接アクセスすると リダイレクトしないのでしょうか? rails の routes はどのような定義になっていますか?
guest

回答2

0

ベストアンサー

unicorn側のHTTPS強制設定が無限に発動してる可能性がありますね。
nginx側の設定でHTTPかHTTPSかの情報をヘッダに追加するといけるってネットに書いてありました。

proxy_set_header X-Forwarded-Proto $scheme;

参考 https://stackoverflow.com/questions/9448168/why-am-i-getting-infinite-redirect-loop-with-force-ssl-in-my-rails-app

投稿2019/05/16 05:16

set0gut1

総合スコア2413

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

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

koume

2019/05/16 14:31

いつも的確な回答ありがとうございます。 おかげさまで無事解決できました。 CHERRY様の度重なるアドバイス及びご指摘でここ3ヶ月ほどのエラーが解決できましたことを 深く感謝しております。私のようなものの見当違いの質問に丁寧に対応くださり有り難うございました。 まだまだ、初心者の域は脱出できておりませんが今後とも宜しくお願いいたします。 私以外の質問の回答も参考にさせていただきましたが、CHERRY様が本当に丁寧に対応されている回答を たくさん参考にさせていただき解決できたエラーもありました。 いつか、CHERRY様のように困っている方に寄り添って、一緒に問題解決できるようになりたいと思います。 今回のエラーに関しては本当に挫折寸前でした。 本当に有り難うございました。
set0gut1

2019/05/16 15:50

解決したようで良かったです!(僕はset0gut1です)
koume

2019/05/17 01:01

あっ!大変失礼いたしました。CHERRY様にはここ2年ほど質問のたびに大変お世話になっていたのでお礼の意味もありました。一個前の同類の質問もCHERRY様とやりとりしていたのでてっきりCHERRY様と勘違いしてしまいました。大変申し分けございませんでした。 回答の内容によっては、回答自体が初心者にとっては理解出来ないものも少なくないので、今回のような的確な回答は、私のような初心者には大変うれしい回答です。 初心者はここに質問する段階でパニック状態の人が多いと思いますので、私のような初心者のためにも 今後もこのような回答を頂ければと思います。 この度は、お礼の相手を間違えるという大変失礼なことをしてしまい申し訳ございませんでした。 set0gut1様、大変有り難うございました。おかげさまで、ページの表示はできました。 あとは、データベース周りを整えて終了というところです。 なんとか、開発環境構築から公開まで一人でできそうです。少しは、「底辺エンジニアです。」と言えるくらいにはなったかとおもいます。 今後とも宜しくお願いいたします。本当に有り難うございました。
set0gut1

2019/05/17 05:22

CHERRYさんにめっちゃ助けられたんだなぁということが伝わってきました。良いですね!残りの部分も頑張ってください。
guest

0

Railsを使ったことはないのですが、まずは問題の切り分けをする必要がありそうですね。 Rails5単体だとそのリダイレクトは起きますか?

次に Rails5 抜きの同様の設定をNginxで行なったときリダイレクトは起きますか?

投稿2019/05/16 00:36

Kentaro0919

総合スコア258

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

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

koume

2019/05/16 14:21

回答ありがとうございます。 問題の切り分けは行っていませんが、CHERRY様の回答を行ったところ解決できました。 proxy_set_header X-Forwarded-Proto $scheme;を追加して解決です。 今後とも宜しくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問