web-dev-qa-db-ja.com

特定のnginxサーバーブロックのみをプログラムでメンテナンスモードに設定する方法

アプリケーションのデプロイメントプロセスの1つを自動化するソリューションを探しています。展開の最初に、指定したサーバーをプログラムでメンテナンスモードに設定し、最後に展開が完了したら、nginxサーバーからメンテナンスモードフラグを削除します。

メンテナンスモードとは、nginxがすべてのリクエストにHTTPレスポンスコード503で応答する必要があることを意味します(可能なカスタムページを使用)。

503コードで応答するようにサーバーブロックを設定する方法を知っています( http://www.cyberciti.biz/faq/custom-nginx-maintenance-page-with-http503/ を参照)が、質問これをプログラムで最も効率的に行う方法についてです。

2つのオプションが頭に浮かびました。

オプション1:展開プロセスの開始時に、メンテナンスファイルをドキュメントルートに書き込み、nginxサーバー構成でメンテナンスファイルの存在を条件付きで確認します。

server {
    if (-f $document_root/in_maintenance_mode) {
        return 503;
    }
}

このメソッドには、リクエストごとにファイルの存在がチェックされるため、特定のオーバーヘッドが含まれます。 nginx設定をロードするときにのみファイルの存在を確認することは可能ですか?

オプション2:デプロイメントスクリプトは、nginxサーバー構成ファイル全体をメンテナンスバージョンに置き換え、デプロイメントの最後にスワップバックします。この方法を使用する場合、メンテナンス構成ファイルをオーバーライドする可能性のあるpuppetなどの他の自動化プロセスの可能性が心配です。

7
Ville Mattila

オプション1が最良の選択です。追加のファイル要求が気になる場合は(オーバーヘッドはほとんどありませんが)、変数チェックに置き換えることができます。

set $maintenance "on";
if ($maintenance = "on") {
    return 503;
}
4

私がすることはこれです:

  • 明示的なスイッチを使用しないが、haproxy(またはワニス)をアップストリームの次のコンポーネントにする
  • 次のコンポーネントを無効にするか、別のポートに移動します
  • 次のスニペットを使用します。

    ...
    error_page 502 503 /_maintenance/index.html;
    location ^~ /_maintenance {
        alias some/place/on/your/disk/static/_maintenance;
    }
    ...
    
0
Theuni