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

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

新規登録して質問してみよう
ただいま回答率
85.35%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

nginx

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

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

VPS

VPS(バーチャル・プライベート・サーバ)は、仮想化されたサーバをレンタルするサービスで、共有サーバでありながら専門サーバと同等の機能を果たします。物理的な専門サーバより安価で提供できるメリットがあります。

Q&A

解決済

2回答

2909閲覧

【解決】VPS(conoha)のCentOS7で動しているNginxで301リダイレクトループが発生している原因を教えてください!

yu-imu

総合スコア35

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

nginx

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

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

VPS

VPS(バーチャル・プライベート・サーバ)は、仮想化されたサーバをレンタルするサービスで、共有サーバでありながら専門サーバと同等の機能を果たします。物理的な専門サーバより安価で提供できるメリットがあります。

0グッド

0クリップ

投稿2020/03/18 15:00

編集2020/03/22 10:54

実現したいこと

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の設定が問題だと思うのですが、、特に設定した箇所がないので、原因の特定方法がわかりません。

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

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

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

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

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

guest

回答2

0

原因は、Nginxではなくrails productionモード側の設定が不足していたためでした。
試しに、docker-composeのdevバージョンをVPSで立ち上げると正しく動作することが確認できました。

投稿2020/03/22 05:45

編集2020/03/22 06:58
yu-imu

総合スコア35

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

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

yu-imu

2020/04/06 08:00

productionモードの格闘については下記リンクをご参照ください (※ちなみに解決しているのでハマった方は参考にしていただけるとよいと思います。 https://teratail.com/questions/250229
guest

0

ベストアンサー

AWSのELBとNginxでhttpアクセスをhttpsにリダイレクトしたい
に記載のif判定を追加してみるといかがでしょうか

# ここの部分で判定!! if ($http_x_forwarded_proto != https) { return 301 https://$host$request_uri; }

投稿2020/03/18 15:57

yukky1201

総合スコア2751

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

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

yu-imu

2020/03/19 12:10

ご回答ありがとうございます。 特に301エラーから変化はありませんでした泣
yu-imu

2020/03/19 12:23

return 301の部分を消してdockerをbuildしても301になるので設定が間違っているのですかね。
yu-imu

2020/03/20 10:04

再び回答ありがとうございます。 500エラーになりました。(proxy_set_header X-Forwarded-Proto $scheme;proxy_redirect off;を設定した時と同じ挙動です。) 193.117.86.189 - - [20/Mar/2020:10:01:53 +0000] "GET / HTTP/1.1" 500 0 "-" "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" "-"
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問