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

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

解決済

1回答

1531閲覧

403ForbiddenとERR_TOO_MANY_REDIRECTSのどちらかが発生してしまい解決方法のご教示お願いします。

koume

総合スコア458

Ruby on Rails 5

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

nginx

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

0グッド

0クリップ

投稿2019/05/13 08:52

編集2019/05/13 17:51

Railsアプリをデプロししました。
しかしサイトへアクセスしてもページの表示が出来なくて困っています。
エラーの内容は以下のどちらかになります。

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

もしくは

403 Forbidden nginx/1.14.2

です。
以下のNginxの設定が間違っていると思うのですが、正しい記述がわかりません。

/eyc/nginx/conf.d/https.conf upstream app_server { server unix:/usr/share/nginx/html/current/tmp/sockets/.unicorn.sock; } 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; 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/wonder-gate.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/wonder-gate.com/privkey.pem; #error_page 500 502 504 /50x.html; #location = /50x.html { #root /usr/share/nginx/html; #} proxy_connect_timeout 130; proxy_read_timeout 130; proxy_send_timeout 130; client_max_body_size 2G; error_page 404 /404.html; error_page 500 502 504 /500.html; #try_files $uri/index.html $uri.html $uri @app; location @app { deny 212.64.88.231; 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_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; } }

エラーlogは以下になります。

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: "panda-hogeapp.com"
ERR_TOO_MANY_REDIRECTS 発生時の log/unicorn.log XXX.XXX.XXX.XX - - [13/May/2019:16:58:06 +0900] "GET / HTTP/1.0" 301 - 0.0007 XXX.XXX.XXX.XX - - [13/May/2019:16:58:06 +0900] "GET / HTTP/1.0" 301 - 0.0003 XXX.XXX.XXX.XX - - [13/May/2019:16:58:06 +0900] "GET / HTTP/1.0" 301 - 0.0007 XXX.XXX.XXX.XX - - [13/May/2019:16:58:06 +0900] "GET / HTTP/1.0" 301 - 0.0004 XXX.XXX.XXX.XX - - [13/May/2019:16:58:06 +0900] "GET / HTTP/1.0" 301 - 0.0003 XXX.XXX.XXX.XX - - [13/May/2019:16:58:06 +0900] "GET / HTTP/1.0" 301 - 0.0009 この記述が大量に出ています。たぶんリダイレクトの履歴かと思います。

location / { }内部にtry_files $uri/index.html $uri.html $uri @app;を記述すると リダイレクトループ(ERR_TOO_MANY_REDIRECTS)が発生し、
server{ }内に記述すると403Forbidden が発生してしまうのです。

なのでこの記述が悪さしているのだと思っていますが解決方法がわからないのでどなたか
解決方法を教えていただけないでしょうか?

宜しくお願いします。

追記(unicorn関連の設定ファイルを追記します。)

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 #listen "/var/run/unicorn.sock" #pid "/var/run/unicorn.pid" #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
lib/capistrano/tasks/unicorn.rb #unicornのpidファイル、設定ファイルのディレクトリを指定 namespace :unicorn do task :environment do set :unicorn_pid, "#{current_path}/tmp/pids/unicorn.pid" set :unicorn_config, "#{current_path}/config/unicorn/production.rb" end #unicornをスタートさせるメソッド def start_unicorn within current_path do execute :bundle, :exec, :unicorn, "-c #{fetch(:unicorn_config)} -E #{fetch(:rails_env)} -D" end end #unicornを停止させるメソッド def stop_unicorn execute :kill, "-s QUIT $(< #{fetch(:unicorn_pid)})" end #unicornを再起動するメソッド def reload_unicorn execute :kill, "-s USR2 $(< #{fetch(:unicorn_pid)})" end #unicronを強制終了するメソッド def force_stop_unicorn execute :kill, "$(< #{fetch(:unicorn_pid)})" end #unicornをスタートさせるtask desc "Start unicorn server" task start: :environment do on roles(:app) do start_unicorn end end #unicornを停止させるtask desc "Stop unicorn server gracefully" task stop: :environment do on roles(:app) do stop_unicorn end end #既にunicornが起動している場合再起動を、まだの場合起動を行うtask desc "Restart unicorn server gracefully" task restart: :environment do on roles(:app) do if test("[ -f #{fetch(:unicorn_pid)} ]") reload_unicorn else start_unicorn end end end #unicornを強制終了させるtask desc "Stop unicorn server immediately" task force_stop: :environment do on roles(:app) do force_stop_unicorn end end end

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

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

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

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

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

guest

回答1

0

ベストアンサー

unicorn.logに記録が残るということは、処理はHTTPサーバ(nginx)の奥に渡っているはずです。

unicornのサーバで301のリダイレクトが起こっているのが変な気がします。

投稿2019/05/13 11:55

otolab

総合スコア765

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

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

koume

2019/05/13 16:10

回答ありがとうございます。 「unicornのサーバで301のリダイレクトが起こっているのが変な気がします。」とありますが どのような原因が考えられるのでしょうか?初心者なので見当もつかないので手も足もでません。 unicornの設定がおかしいのでしょうか? お手数をおかけしますが宜しくお願いします。
otolab

2019/05/13 16:49

``` location @app { deny 212.64.88.231; 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_pass http://app_server; } ``` ここで定義されているapp_serverというのに処理が送られていると思うのですが、このサーバが `/` へのアクセスに対して301を返して来ている状態だと思います。(unicorn.logのログはそういう意味) http://app_sever/ へのアクセスでどのような処理を行っているのか質問文には記述がありませんが、そちらを調べるべきだと思います。
koume

2019/05/13 17:30

夜分遅くに大変ありがとうございます。初心者なので認識が間違っているるかもしれませんが、 try_files $uri/index.html $uri.html $uri @app;でlocation @app { }にリダイレクトされ proxy_pass http://app_server;でupstreamブロックで定義したバックエンド(app_server)にリクエストを中継する。という設定のつもりでした。 app_serverにはserver unix:/usr/share/nginx/html/current/tmp/sockets/.unicorn.sock;のように unicornとの通信につかうsockファイルのパスを記述しています。 この辺がおかしいと思うのですが、ご指摘いただけないでしょうか? よろしくおねがいします。
otolab

2019/05/13 17:33

> app_serverにはserver unix:/usr/share/nginx/html/current/tmp/sockets/.unicorn.sock;のように > unicornとの通信につかうsockファイルのパスを記述しています。 sockの先に、そのリクエストを処理するプロセスがいるはずです。 そのコードが適切でないリダイレクトの応答を返しているのだと思います。 (おそらくkoumeさんが書いたコードが動いているのだと思うのですが。)
koume

2019/05/13 17:55

回答ありがとうございます。 unicornの設定ファイルを追記いたしました。 「sockの先に、そのリクエストを処理するプロセス」がどこを指しているのかがわからないので unicornのファイルを追記させていただきましたが、 $listen = File.expand_path 'tmp/sockets/.unicorn.sock', $app_dir の先のプロセスのコードがわかるようでしたら教えていただけないでしょうか? 本当にお手数とご迷惑をお掛けして申し訳ございません。
koume

2019/05/14 01:31

深夜にもかかわらず丁寧な対応ありがとうございました。Nginxの設定に誤りがありリダイレクトが繰り返し行われていたようです。変更した内容は以下になります。 proxy_pass http://app_server; を proxy_pass https://app_server; に変更し (httpをhttpsに変更) proxy_redirect off; を追記したところERR_TOO_MANY_REDIRECTSは解消されました。 が 悲しいことに We're sorry, but something went wrong. が発生しています。 これの解決にまた、徹夜になりそうです。 今後とも宜しくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問