眠すぎて明日が見えない

我が人生、眠さに勝るもの無し

nginxでメンテナンスモード時の503と通常時の503でhtmlを分ける方法

nginxでメンテモードを実装した。機能としては/tmp/503ファイルがあったら、nginxがメンテナンス画面を出すというもの。

最初は503のstatusだったらメンテナンス画面をだすという実装だったけど、メンテナンス以外の時で503の場合は別のviewを出したかったので下記のようなconfigファイルにした。

server {
  listen 80;
  server_name  _;

  error_page 503 @503_error;
  set $maintenance 0;

  if (-f "/tmp/503") {
    set $maintenance 1;
  }

  if ($allow = 1) {
    set $maintenance 0;
  }

  if ($maintenance = 1) {
     return 503;
  }

  location @503_error {
    root /etc/nginx/html;
    internal;
    expires 0;
    if ($maintenance = 1) {
      rewrite ^(.*)$ /maintenance/503.html break;
    }

    if ($maintenance != 1) {
      rewrite ^(.*)$ /503.html break;
    }
  }

  location / {
    ...
  }

ポイントとしては、

  • 503のstatusの時はカスタムエラーページを出せるように error_page 503 @503_error;を設定すること
  • location @503_errorの内部では
    • キャッシュさせないようにexpires 0を指定する
    • ifとrewriteを使いviewの出し分けを実装しているが、302になってしまうとSEO的に困るのでinternalを指定して内部的な処理にしているところ

かなと。

最初 location /503.htmlのような指定を使っていたけど、これだと上手くlocationに入らないケースがあって、そこは正直良く挙動の理解ができないです..

@でlocationの指定を行うようにしたら意図した挙動になりました。うーん違いがよくわらん