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

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

ただいまの
回答率

90.54%

  • nginx

    999questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,741

sequence

score 23

 やりたいこと

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に疎く全くわからないため、ご教授の程、宜しく御願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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


ではないでしょうか?

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


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

もしかして、systemd 環境ではありませんか?
/lib/systemd/system/nginx.service で PrivateTmp=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 23:38

    ご回答ありがとうございます。

    上記のように変更致しましたが、変化はなくトップページが表示されたままでした。

    キャンセル

  • 2017/01/18 09:37 編集

    追加のご回答ありがとうございます。

    systemd環境ではないように思えます。
    sudo find / -name nginx.service
    で検索をかけてもファイルが見当たりませんでした。

    また、nginxの起動コマンドは
    sudo service nginx start
    としております。

    キャンセル

  • 2017/01/18 18:13

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

    キャンセル

  • 2017/01/18 18:43

    すみません、もしかしたらロードバランサーを利用しているからでしょうか。

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

    キャンセル

  • 2017/01/19 19:14

    ご返答ありがとうとざいます。

    ロードバランサーはELBとなります。
    access_logで切り分けを行ったところ、server{}がlogがポート80の方で出力されたことから
    (1) HTTP 80番ポートで受ける : HTTPS 443->[LB]->HTTP 80->[EC2]
    であると考えられます。

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

    キャンセル

  • 2017/01/19 19:14

    ご返答ありがとうとざいます。

    ロードバランサーはELBとなります。
    access_logで切り分けを行ったところ、server{}がlogがポート80の方で出力されたことから
    (1) HTTP 80番ポートで受ける : HTTPS 443->[LB]->HTTP 80->[EC2]
    であると考えられます。

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

    キャンセル

  • 2017/01/20 00:28

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

    キャンセル

  • 2017/01/20 11:05

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

    キャンセル

  • 2017/01/20 17:47

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

    キャンセル

同じタグがついた質問を見る

  • nginx

    999questions

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