Назад | Перейти на главную страницу

Как программно установить в режим обслуживания только определенный блок сервера nginx

Я ищу решение для автоматизации процесса развертывания одного из наших приложений. В начале развертывания я хотел бы программно установить указанный сервер в режим обслуживания и, наконец, после завершения развертывания удалить флаг режима обслуживания с сервера nginx.

Под режимом обслуживания я подразумеваю, что nginx должен отвечать HTTP-кодом ответа 503 на все запросы (с возможной настраиваемой страницей).

Я знаю, как настроить серверный блок на ответ кодом 503 (см. http://www.cyberciti.biz/faq/custom-nginx-main maintenance-page-with-http503/), но вопрос в том, как это сделать программно и максимально эффективно.

На ум пришли два варианта:

Опция 1: В начале процесса развертывания запишите файл обслуживания в корень документа и условно проверьте наличие файла обслуживания в конфигурации сервера nginx:

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

Этот метод содержит определенные накладные расходы, так как наличие файла проверяется для каждого запроса. Можно ли проверить наличие файла только при загрузке конфига nginx?

Вариант 2: Сценарий развертывания заменяет весь файл конфигурации сервера nginx на версию для обслуживания и меняет его обратно в конце развертывания. Если используется этот метод, меня беспокоят другие возможные процессы автоматизации, такие как марионетка, которые могут переопределить файл конфигурации обслуживания.

Вариант 1 - лучший выбор. Если вас беспокоит дополнительный запрос файла (хотя накладных расходов в нем почти нет), вы можете заменить его на проверку переменных:

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

Я делаю вот что:

  • не использовать явный переключатель, но иметь haproxy (или varnish) как следующий компонент вверх по течению
  • отключить следующий компонент или переместить его в отдельный порт
  • используйте следующий фрагмент:

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