nginxでメンテナンスページを表示する

0

nginxで、特定のIPアドレスからのアクセスでは通常の画面を表示し、それ以外のIPアドレスではメンテナンス画面を表示する設定を調べてみました。いくつか方法があり、nginx設定ファイルの再編集、nginxリロードなしでできる方法を試しましたが、if分岐が動作しなかったため断念しました。以下の方法ですんなりと動きました。

準備1.メンテナンス用htmlファイルを用意する

サーバ上のドキュメントルートに、メンテナンス用のhtmlファイルをアップロードします。 

例:

 /var/www/html/maintenance.html

準備2.メンテナンス用設定ファイルを作成する

コマンド例:

$ sudo vi /etc/nginx/conf.d/maintenance

ファイルの内容は以下のとおりです。 

設定ファイル:

error_page 500 @maintenance;
# Set Env
set $maintenance "on";
# Allow Paths
if ($uri ~ "^/exclude/") {
    set $maintenance "off";
}
# Allow IPs
if ($remote_addr ~ "xxx.xxx.xxx.xxx") {
    set $maintenance "off";
}
if ($http_x_forwarded_for ~ "xxx.xxx.xxx.xxx") {
    set $maintenance "off";
}
# maintenance
if ($maintenance = "on") {
    return 500;
}
location @maintenance {
    rewrite ^(.*)$ /maintenance.html break;
}

※「xxx.xxx.xxx.xxx」の部分には、通常画面の表示を許可するIPアドレスを入れます。

準備3.nginx設定ファイルの変更

コマンド例:

$ sudo vi /etc/nginx/nginx.conf

serverコンテキスト内に以下の設定を追加します。 includeの行は、通常コメントアウトしておき、メンテナンス時のみ有効にして切り替えます。

設定ファイル:

server {
    ...
    #include /etc/nginx/conf.d/maintenance;
    rewrite ^/maintenance.html(.*)$ https://$host/ permanent;
    ...
}

実際の切替手順は以下のとおりです。

1.nginx設定ファイルの変更

コマンド例:

$ sudo vi /etc/nginx/nginx.conf

先ほど追加したserverコンテキスト内のinclude行を有効化し、nginx.confファイルを保存します。

設定ファイル:

server {
    ...
    include /etc/nginx/conf.d/maintenance;
    rewrite ^/maintenance.html(.*)$ https://$host/ permanent;
    ...
}

2.nginxのリロード

コマンド例:

$ sudo nginx -s reload

3.メンテナンスページへの切り替えを確認

実際にWebブラウザ等からアクセスを試して確認します。

4.通常のページに戻すときは

上記の実施1で変更したnginx設定ファイルを元に戻し(つまり有効化したinclude行をコメント化して)nginxをリロードします。そして通常のページ表示に戻ったことを確認し完了です。

nginxの設定ファイル(通常時):

nginxのリロード:

以下の記事を参考にさせていただきました。

ありがとうございます。

参考サイト

nginxでメンテナンスページを表示させる。改良版 - Qiita
はじめに 以前書いた記事で、「nginxでメンテナンスページを表示させる。」というのがあるのですが、もっと良いやり方があったので改めて書きます。 設定 とりあえず設定内容です。今回もmaintenanceというファイルをi...
0
タイトルとURLをコピーしました