Как программно перевести только определенный блок сервера nginx в режим обслуживания
Я ищу решение для автоматизации одного из процессов развертывания нашего приложения. В начале развертывания я хотел бы программно перевести указанный сервер в режим обслуживания и, наконец, после завершения развертывания убрать флаг режима обслуживания с сервера nginx.
Под режимом обслуживания я имею в виду, что nginx должен отвечать HTTP-кодом ответа 503 на все запросы (с возможной пользовательской страницей).
Я знаю, как настроить блок сервера так, чтобы он отвечал кодом 503 (см. http://www.cyberciti.biz/faq/custom-nginx-maintenance-page-with-http503/), но вопрос в том, как это сделать программно и наиболее эффективно.
Мне пришло в голову два варианта:
Вариант 1. В начале процесса развертывания запишите файл обслуживания в корень документа и условно проверьте наличие файла обслуживания в конфигурации сервера nginx:
server {
if (-f $document_root/in_maintenance_mode) {
return 503;
}
}
Этот метод содержит определенные издержки, так как существование файла проверяется для каждого запроса. Можно ли проверить наличие файла только при загрузке конфига nginx?
Вариант 2. Сценарий развертывания заменяет весь файл конфигурации сервера nginx на версию для технического обслуживания и заменяет его в конце развертывания. Если этот метод используется, я обеспокоен возможными другими процессами автоматизации, такими как марионетка, которые могут переопределить файл конфигурации обслуживания.
2 ответа
Вариант 1 - лучший выбор. Если дополнительный запрос файла беспокоит вас (хотя в нем почти нет служебных данных), вы можете заменить его на проверку переменных:
set $maintenance "on";
if ($maintenance = "on") {
return 503;
}
Я делаю вот что:
- не использовать явный переключатель, но иметь haproxy (или лак) следующим компонентом вверх по течению
- отключить следующий компонент или переместить его на отдельный порт
используйте следующий фрагмент:
... error_page 502 503 /_maintenance/index.html; location ^~ /_maintenance { alias some/place/on/your/disk/static/_maintenance; } ...