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

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

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

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

Q&A

解決済

1回答

5244閲覧

Nginxを用いてメンテナンスページへリダイレクトさせたい

sequence

総合スコア29

nginx

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

0グッド

0クリップ

投稿2017/01/16 10:31

編集2017/01/20 02:04

やりたいこと

Nginxの設定ファイルを用いてメンテナンスページへリダイレクトさせて表示させたいです。

下記を参考にして設定をしてみました。

現状

httpへリクエストがあった時にhttpsへリダイレクトをnginxで下記を参考に行っております。
http://qiita.com/ichiki1023/items/baaf4d47083fb4a6396b

メンテナンスページがあることは確認できるのですが、
"リダイレクトが繰り返し行われました。"というエラーが出て、
ページが表示できません。

nginx設定(※一部抜粋)
http{ upstream my-backend{ server 127.0.0.1:9000; } server{ listen 80 default_server; ... # ここからメンテナンスページ設定 # setディレクティブでメンテナンスon/off用フラグ変数を設定 set $maintenance false; # /var/tmp/nginx/maintenanceがある場合はメンテモード if (-e /var/tmp/nginx/maintenance ) { set $maintenance true; } # メンテ時でもサイトを確認するためのワークアラウンド # 特定のアドレスからの場合は通常の状態の表示を許可 if ($remote_addr = XXX.XXX.XXX.XXX) { set $maintenance false; } # メンテナンスモードの場合は/maintenance.htmlにrewirteしつつ、rootディレクトリを書き換える # この場合だと/var/tmp/nginx/maintenance/maintenance.htmlがメンテナンス画面用ファイルになる # このような周りくどい設定にしているのは通常時にmaintenance.htmlを直アクセスで見れないようにするため。 if ($maintenance = true) { rewrite ^ /maintenance.html redirect; } # メンテナンスファイルの置き場を指定 location /maintenance.html { root /var/tmp/nginx/maintenance; # キャッシュさせないようにexpiresを0にしておく expires 0; } } location / { proxy_pass http://my-backend; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forworded_for; proxy_http_version 1.1; prosy_set_header Upgrade $http_upgrade; prosy_set_header Connection "upgrade"; } server{ listen 443 ssl; ... } }

リダイレクトはできているようなのですが、
passの設定等がよくなく、ページが表示されません。

Nginxに疎く全くわからないため、ご教授の程、宜しく御願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

if ($maintenance = true) { ↓ if ($maintenance) {

ではないでしょうか?

また、rewrite を工夫しないと /maintenance.html がリダイレクトループになるように思います。


(2017/01/18) 00:32 追記
すみません、回答は間違いでした。

もしかして、systemd 環境ではありませんか?
/lib/systemd/system/nginx.servicePrivateTmp=true となっているのではないでしょうか?
この場合、/tmp/, /var/tmp/ は独自の名前空間となるので、nginx プロセスからは /var/tmp/nginx/maintenance/ が見えなくなります。

/tmp/, /var/tmp/ 以外のディレクトリにすると、if (-e ...) にマッチし、set $maintenance true; が有効になると思います。


(2017/01/18) 23:20 追記
AWS のロードバランサーをお使いとのこと、ALB, ELB (Classic) のどちらでしょうか?
ロードバランサーで HTTPS 443番ポートで受けたものは、EC2インスタンス側では

(1) HTTP 80番ポートで受ける : HTTPS 443->[LB]->HTTP 80->[EC2]
(2) HTTPS 443番ポートで受ける : HTTPS 443->[LB]->HTTPS 443->[EC2]

のどちらでしょうか?
(2)であれば、今の設定で動きそうに思います。
(1)であれば、Nginx は HTTP 80番しか使われません。
80, 443 の server {} でそれぞれ access_log を分けると切り分けできると思います。

なお、ELB (Classic) であれば、HTTP, HTTPS のどちらで受けたのか、X-Forwarded-Proto, X-Forwarded-Port ヘッダでわかります。
http://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/x-forwarded-headers.html

あるいは、

  • HTTP 80->[LB]->HTTP 80->[EC2]
  • HTTPS 443->[LB]->HTTP 81->[EC2]

のように、HTTP の別ポートを用意して区別してもいいと思います。


(2017/01/20) 17:39 追記
設定例(抜粋):

if ($http_x_forwarded_proto != https) { return 301 https://$host$request_uri; } set $maintenance false; if (-e /var/tmp/nginx/maintenance) { set $maintenance true; } if ($remote_addr = XXX.XXX.XXX.XXX) { set $maintenance false; } if ($maintenance = true) { rewrite ^(/maintenance.html)$ $1 last; rewrite ^ https://$host/maintenance.html redirect; } location /maintenance.html { root /var/tmp/nginx/maintenance; expires 0; }

投稿2017/01/17 10:08

編集2017/01/20 08:40
TaichiYanagiya

総合スコア12146

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

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

sequence

2017/01/17 14:38

ご回答ありがとうございます。 上記のように変更致しましたが、変化はなくトップページが表示されたままでした。
sequence

2017/01/18 00:37 編集

追加のご回答ありがとうございます。 systemd環境ではないように思えます。 sudo find / -name nginx.service で検索をかけてもファイルが見当たりませんでした。 また、nginxの起動コマンドは sudo service nginx start としております。
TaichiYanagiya

2017/01/18 09:13

手元の環境(CentOS 6.8, nginx-1.10.2-1.el6.ngx.x86_64)では sequence さんの設定で動作しました。 バーチャルホストで別の server で処理されているとか?
sequence

2017/01/18 09:43

すみません、もしかしたらロードバランサーを利用しているからでしょうか。 AWSのロードバランサーにSSLを設定しており、 リクエストがあった際に、ポート80からポート443へリダイレクトするようにしております。
sequence

2017/01/19 10:14

ご返答ありがとうとざいます。 ロードバランサーはELBとなります。 access_logで切り分けを行ったところ、server{}がlogがポート80の方で出力されたことから (1) HTTP 80番ポートで受ける : HTTPS 443->[LB]->HTTP 80->[EC2] であると考えられます。 そうなるとserver{}のポート80内で上記の処理をする必要があるということですね。
sequence

2017/01/19 10:14

ご返答ありがとうとざいます。 ロードバランサーはELBとなります。 access_logで切り分けを行ったところ、server{}がlogがポート80の方で出力されたことから (1) HTTP 80番ポートで受ける : HTTPS 443->[LB]->HTTP 80->[EC2] であると考えられます。 そうなるとserver{}のポート80内で上記の処理をする必要があるということですね。
TaichiYanagiya

2017/01/19 15:28

> そうなるとserver{}のポート80内で上記の処理をする必要があるということですね。 そうだと思います。
sequence

2017/01/20 02:05

色々とリダイレクト時の設定を変えてはいるのですが、 一向に意図するページが表示できません。 大変お手数でございますが、改めてご指摘いただけますでしょうか。 宜しく御願い致します。
sequence

2017/01/20 08:47

ありがとうございます。 無事にリダイレクトされて、意図するページが表示されました。 色々お世話になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問