実現したいこと
VPS(conoha)にherokuで動いているサービスの移行を行なっています。
https://IPアドレスを叩くとローカル環境同様アプリケーションが正しく動作することを期待しています。
しかし、https://IPアドレスにアクセスした際に、**301リダイレクトループ**してしまうエラーにハマっております。
問題を分解して検討しましたが、解決する糸口が見えないため相談させてください。
前提
本アプリケーションはローカル(mac os x)、およびVPS(CentOS7)にDockerを立ててアプリケーションを起動しております。また**、ローカル環境では**https://localhostで**正常にアプリケーションが動作**しております。
構成は、Rails+Nginx+Redis+MySQLをDockerfileに記述しておりVPS環境ではNginx以外は正常に動作しています。
発生している問題・エラーメッセージ
https://IPアドレスを叩くと下記のエラー文言が画面に表示されました。
このページは動作していません IPアドレス でリダイレクトが繰り返し行われました。 Cookie を消去してみてください. ERR_TOO_MANY_REDIRECTS
DockerのLog
rails_1 | Puma starting in single mode... rails_1 | * Version 3.12.4 (ruby 2.6.5-p114), codename: Llamas in Pajamas rails_1 | * Min threads: 5, max threads: 5 rails_1 | * Environment: production rails_1 | * Listening on tcp://0.0.0.0:3000 rails_1 | * Listening on unix:///アプリケーション名/tmp/sockets/puma.sock rails_1 | Use Ctrl-C to stop nginx_1 | 110.67.152.24 - - [18/Mar/2020:13:29:52 +0000] "GET / HTTP/1.1" 301 5 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" "-" nginx_1 | 110.67.152.24 - - [18/Mar/2020:13:29:52 +0000] "GET / HTTP/1.1" 301 5 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" "-" nginx_1 | 110.67.152.24 - - [18/Mar/2020:13:29:52 +0000] "GET / HTTP/1.1" 301 5 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" "-" nginx_1 | 110.67.152.24 - - [18/Mar/2020:13:29:52 +0000] "GET / HTTP/1.1" 301 5 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" "-" (以下同じエラーが続く)
curl -I https://IPアドレス
自己証明書だからこのエラーが出ていると思っております。
curl: (60) SSL certificate problem: self signed certificate More details here: https://curl.haxx.se/docs/sslcerts.html curl performs SSL certificate verification by default, using a "bundle" of Certificate Authority (CA) public keys (CA certs). If the default bundle file isn't adequate, you can specify an alternate file using the --cacert option. If this HTTPS server uses a certificate signed by a CA represented in the bundle, the certificate verification probably failed due to a problem with the certificate (it might be expired, or the name might not match the domain name in the URL). If you'd like to turn off curl's verification of the certificate, use the -k (or --insecure) option. HTTPS-proxy has similar options --proxy-cacert and --proxy-insecure.
curl -I http://IPアドレス
HTTP/1.1 301 Moved Permanently Server: nginx/1.17.4 Date: Wed, 18 Mar 2020 15:00:05 GMT Content-Type: text/html Content-Length: 169 Connection: keep-alive Location: https://IPアドレス/
該当のソースコード
nginx.conf
# Nginxが受け取ったリクエストをバックエンドのpumaに送信 upstream サービス名 { server unix:///サービス名/tmp/sockets/puma.sock fail_timeout=30s; } # devとprodで条件分岐する。 geo $allow_ip { default 0; IPアドレス 1; } server { listen 80; server_name _; return 301 https://$host$request_uri; } server { listen 443 ssl; server_name IPアドレス localhost; ssl_certificate /etc/nginx/ssl/server.crt; ssl_certificate_key /etc/nginx/ssl/server.key; ssl_protocols SSLv3 TLSv1; ssl_ciphers HIGH:!ADH:!MD5; client_max_body_size 100m; error_page 404 /404.html; error_page 505 502 503 504 /500.html; try_files $uri/index.html $uri @サービス名; keepalive_timeout 120; location @サービス名{ if ($allow_ip = 0) { root /サービス名/public; } if ($allow_ip = 1) { root /var/サービス名/current/public; } 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://サービス名; } }
修正中_2020/03/20 Nginx.conf
# Nginxが受け取ったリクエストをバックエンドのpumaに送信 upstreamサービス名 { server unix:///サービス名/tmp/sockets/puma.sock fail_timeout=30s; } # devとprodで条件分岐する。 geo $allow_ip { default 0; IPアドレス 1; } server { listen 80; server_name _; if ($http_x_forwarded_proto != https) { return 301 https://$host$request_uri; } } server { listen 443 ssl; server_name IPアドレス localhost; ssl_certificate /etc/nginx/ssl/server.crt; ssl_certificate_key /etc/nginx/ssl/server.key; ssl_protocols SSLv3 TLSv1; ssl_ciphers HIGH:!ADH:!MD5; client_max_body_size 100m; error_page 404 /404.html; error_page 505 502 503 504 /500.html; try_files $uri/index.html $uri @サービス名; keepalive_timeout 120; location @サービス名{ if ($allow_ip = 0) { root /サービス名/public; } if ($allow_ip = 1) { root /var/サービス名/current/public; } proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_set_header Host $http_host; proxy_pass http://サービス名; } }
試したこと
- cookieの削除→変化なし
- root_pathを変更→DBが作成されずエラーになったため現状の設定で問題なし
- CentOS7上のfirewallをオフにする。→変化なし
- 「301 redirect ループ nginx」でGoogle検索→
参考サイトを元にNginx.confに下記を追記すると500エラーになる。
proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect off;
参考サイト例>
https://teratail.com/questions/189637
https://teratail.com/questions/189087
https://stackoverflow.com/questions/9448168/why-am-i-getting-infinite-redirect-loop-with-force-ssl-in-my-rails-app
補足情報(FW/ツールのバージョンなど)
SSLはオレオレ証明書で実装しています。
エラー原因を特定するために必要なファイルがわからないため指摘いただければ追記いたします。
(追記 2020/03/20)
https://IPアドレス/だけでなくhttp://IPアドレス/に関してもNginxで設定しなくても勝手にhttpsにリダイレクトされています。
conoha VPSの設定が問題だと思うのですが、、特に設定した箇所がないので、原因の特定方法がわかりません。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/06 08:00