アプリケーションのデプロイメントプロセスの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などの他の自動化プロセスの可能性が心配です。
オプション1が最良の選択です。追加のファイル要求が気になる場合は(オーバーヘッドはほとんどありませんが)、変数チェックに置き換えることができます。
set $maintenance "on";
if ($maintenance = "on") {
return 503;
}
私がすることはこれです:
次のスニペットを使用します。
...
error_page 502 503 /_maintenance/index.html;
location ^~ /_maintenance {
alias some/place/on/your/disk/static/_maintenance;
}
...