過去に同じような質問をさせていただきましたが、自分なりに調べてコードを記述、修正しては別のエラーが発生し、また調べて・・・を何十回もくりかえしてきましたが、どうやらこのエラーを解決しなければ前進しないようです。
どなたか詳しい方、お助けください。おねがいします。
さくらの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
この解決におおむね数百時間も費やしているので挫折しそうなのですが、どなたか助けていただけないでしょうか?
宜しくお願いします。
回答2件
あなたの回答
tips
プレビュー