5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Nginx】5分でメンテナンスモードを設定する手順(IP制限・簡単にモード切替可能)

Last updated at Posted at 2024-09-03

はじめに

本記事まで足を運んでいただき本当にありがとうございます。
この記事では、Nginxを使用して簡単にメンテナンスモードを設定する方法を紹介します。
検証した環境(OS)は、Rocky Linux 9になります。

【現場で役立つ設定を求めている方向け】
今後の運用を見越した設定を後半に紹介しています。
※こちらは5分以上必要です。

  • 許可した複数のIPアドレスから通常通りアクセスできるようにする
  • Nginxの再起動・ファイルの編集無しで即時切り替える

手順

早速開始します。

1. メンテナンス画面の作成

まずは、一番重要であるメンテナンス画面を準備します。
/var/www/html配下にmaintenance.htmlを作成。

サンプルのhtmlを記載します。
ご自身の環境に合わせて変更が必要です。

/var/www/html/maintenance.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>メンテナンス中</title>
    <style>
        body {
            margin: 0;
            font-family: Arial, sans-serif;
            display: flex;
            justify-content: center;
            align-items: center;
            min-height: 100vh;
            background-color: #f2f2f2;
            color: #333;
            text-align: center;
            padding: 20px;
        }

        .maintenance-container {
            padding: 20px;
            box-shadow: 0 3px 5px rgba(0, 0, 0, 0.22);
            background-color: #ffffff;
        }

        h1 {
            font-size: 24px;
            margin-bottom: 20px;
            background-color: #cce7ff;
            padding: 10px;
        }

        .maintenance-datetime {
            font-size: 18px;
            color: #ff0000;
            margin-bottom: 20px;
        }

    </style>
</head>
<body>
    <div class="maintenance-container">
        <h1>メンテナンス中</h1>
        <p>ただいまメンテナンス中です。</p>
        <p>ご不便をおかけし申し訳ございません。</p>
        <p class="maintenance-datetime"><strong>メンテナンス終了予定日時:</strong> 20XX年XX月XX日 12:00</p>
        <p>お急ぎの方はこちら</p>
        <p><a href="お問い合わせのURL" target="_blank">お問い合わせ</a></p>
    </div>
</body>
</html>

2. Nginxの設定に追加

下記3箇所を追加します。
maintenance.htmlが存在する場合にメンテナンス画面を表示させます。

この記事では/etc/nginx/conf.d/配下を想定しています。
ご自身の環境に合わせて変更が必要です。

/etc/nginx/conf.d/sample.conf
server {

...

    error_page 503 /maintenance.html; 

    set $maintenance false;

    if (-e /var/www/html/maintenance.html) {
      set $maintenance true;
    }
        
    if ($remote_addr = "許可したいIPアドレス") {
      set $maintenance false;
    }
...

}
  location / {
      
   ...
        if ($maintenance = true) {
          return 503;
        }     
   ...
   
  }
  location  /maintenance.html {
        root /var/www/html;
  }

3. Nginxの再起動

再起動を実行することで設定が反映されます。

$ systemctl restart nginx

4.完了

メンテナンス画面が表示されることを確認します。

簡単なメンテナンスモードの実装は完了になりますが、可読性や保守性の悪い点がまだまだあると思います。
より現場で役立つ設定の追加手順をご紹介しておりますので続きをご覧下さい。

【現場で役立つ設定を求めている方向け】

ここからは、より現場で役立つ設定の追加手順をご紹介します。

  • 許可した複数のIPアドレスから通常通りアクセスできるようにする
  • Nginxの再起動・ファイルの編集無しで即時切り替える

1. Nginxの設定を追加

Nginxのgeoモジュールを使用し、default値に1を設定します。

許可したIPアドレス以外(値が1の場合)は、メンテナンスモードを発動させる。

/etc/nginx/nginx.conf
http {

...
    geo $remote_addr $allow_hosts {
      default 1;
      include /etc/nginx/conf.d/maintenance_on;
    }
...

}

2. 許可するIPアドレスを格納するファイルを作成

/etc/nginx/maintenance_allow_hostsファイルを作成します。
「許可したいIPアドレス」と「0」の値を入力します。

許可したIPアドレス(値が0の場合)は、メンテナンスモードを発動させない。

111.11.111.111 0;
112.12.112.112 0;

3.メンテナンスモードの切替に使用するファイルを作成

/etc/nginx/conf.d/maintenance_onを作成します。

$ touch /etc/nginx/conf.d/maintenance_on

4. Nginxの設定を変更

/etc/nginx/conf.d/sample.confの設定を変更します。

(Before) /etc/nginx/conf.d/sample.conf
    
    if (-e /var/www/html/maintenance.html) {
      set $maintenance true;
    }
        
    if ($remote_addr = "許可したいIPアドレス") {
      set $maintenance false;
    }

上記の箇所を下記のコードに置き換えます。

(After) /etc/nginx/conf.d/sample.conf

   if (-e /etc/nginx/conf.d/maintenance_on) {
      set $maintenance true;
   }

   if ($allow_hosts = 0) {
      set $maintenance false;
   }

5. 一度再起動

$ systemctl restart nginx

これで設定は完了しました。

6. メンテナンスモードへの切り替え方法

この記事をここまで読まれた方はお察しかもしれませんが、
/etc/nginx/conf.d/maintenance_onの存在有無によって切り替えることができます。
今回は、名称を変更する事でON/OFFの切り替えを実行します。
Nginxの再起動は不要です。

#メンテナンスモードON
$ mv /etc/nginx/conf.d/maintenance_off /etc/nginx/conf.d/maintenance_on

#メンテナンスモードOFF
$ mv /etc/nginx/conf.d/maintenance_on /etc/nginx/conf.d/maintenance_off

許可するIPアドレスを追加(変更)した場合は、Nginxの再起動が必要です。

最後に

メンテナンスモードのON/OFFが簡単に出来ることは開発者にとって嬉しい事だと思います。ご参考になれば幸いです。

参考URL

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?