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

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

<b>【現場で役立つ設定を求めている方向け】</b>
今後の運用を見越した設定を後半に紹介しています。
※こちらは5分以上必要です。
- 許可した複数のIPアドレスから通常通りアクセスできるようにする
- Nginxの再起動・ファイルの編集無しで即時切り替える
## 手順
早速開始します。

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

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

:::note warn
サンプルの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が存在する場合にメンテナンス画面を表示させます。

:::note warn
この記事では/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モジュール](http://nginx.org/en/docs/http/ngx_http_geo_module.html)を使用し、default値に1を設定します。

:::note
許可したIPアドレス以外（値が1の場合）は、メンテナンスモードを発動させる。
:::
```/etc/nginx/nginx.conf
http {

...
    geo $remote_addr $allow_hosts {
      default 1;
      include /etc/nginx/maintenance_allow_hosts;
    }
...

}
```

## 2. 許可するIPアドレスを格納するファイルを作成
<b>/etc/nginx/maintenance_allow_hosts</b>ファイルを作成します。
「許可したいIPアドレス」と「0」の値を入力します。

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

```
111.11.111.111 0;
112.12.112.112 0;
```

## 3.メンテナンスモードの切替に使用するファイルを作成
<b>/etc/nginx/conf.d/maintenance_on</b>を作成します。
```
$ 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. メンテナンスモードへの切り替え方法
この記事をここまで読まれた方はお察しかもしれませんが、
<b>/etc/nginx/conf.d/maintenance_on</b>の存在有無によって切り替えることができます。
今回は、名称を変更する事でON/OFFの切り替えを実行します。
Nginxの再起動は不要です。
```markdown
#メンテナンスモード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
```
:::note warn
許可するIPアドレスを追加(変更)した場合は、Nginxの再起動が必要です。
:::

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

## 参考URL
https://qiita.com/bzy/items/7db21c1d7c28c56fc8a7

https://qiita.com/hiro9/items/60d77cf93c3e0886bd8b

https://qiita.com/cubicdaiya/items/d938f3354f424830630b

https://nginx.org/en/docs/http/ngx_http_geo_module.html

https://qiita.com/yhidetoshi/items/fcc287b1263447db08bb