Maintenance-мод для Nginx
Зачем?
Краткий ответ - за тем, чтобы при "отвале" сервиса, клиенты видели не дефолтный HTTP/500 ERROR, а вашу разметку.
Как?
В конфигурационном файле сайта (допустим, /etc/nginx/sites-enabled/default), в блоке server указываем что-то типа такого:
server {
# Тут то, что было в блоке до ...
# ------------------------------------------------------
# Общий флаг (/var/www/html/maintenance.flag)
# ------------------------------------------------------
if (-f /var/www/html/maintenance.flag) {
return 503;
}
# ------------------------------------------------------
# Общий обработчик для сервиснах сообщений
# ------------------------------------------------------
error_page 500 502 503 504 =200 @maintenance;
error_page 408 =200 @maintenance;
# этот блок оставляем для физической подачи файла
location @maintenance {
root /var/www/html;
rewrite ^(.\*)$ /maintenance.html break;
}
# Тут то, что было в блоке после ...
}
После чего применим:
nginx -t && nginx -s reload
Как это работает?
Как только ты создашь файл /var/www/html/maintenance.flag, Nginx увидит это и переведет кластер в состояние обслуживание MAINTENANCE). Вместо сайта на фронтэнд-часть будет отправлен файл /var/www/html/maintenance.html.
Аналогичная ситуация будет в случае получения ошибок с HTTP-кодами 500, 502, 503, 504 и 408
Бонус: MAINTENANCE-мод только для конкретных IP-адресов
Если ты знаешь адреса хостов администраторов, и при этом не хочешь чтобы они видели сообщение об обслуживании (т.е. им отдавался сайт в том состоянии, в котором он на самом деле сейчас находится, в конфиге сайта используй такую конструкцию:
# ------------------------------------------------------
# Добавился новый блок для директив MAP и GEO,
# т.к. они не могут располагаться в server
# ------------------------------------------------------
http {
# Кто считается админом (НЕ видит maintenance)
geo $is_admin {
default 0;
10.10.10.0/24 1; # вся подсеть
11.111.111.11 1; # твой внешний IP
127.0.0.1 1; # локально
}
# Принимаем решение, показывать ли maintenance этой сессии
map "$maintenance:$is_admin" $show_maintenance {
default 0; # по умолчанию – не показывать
"1:0" 1; # если техработы включены И клиент не админ → показываем
}
}
# ------------------------------------------------------
# Основной блок сайта
# ------------------------------------------------------
server {
# Тут то, что было в блоке до ...
# ------------------------------------------------------
# Флаг техработ (оставляем как есть, но через переменную)
set $maintenance 0;
if (-f /var/www/html/maintenance.flag) { set $maintenance 1; }
# Блокировка до прокси/роутинга (генерируем исключение, если инстанс в состоянии MAINTENCE)
if ($show_maintenance) { return 503; }
# Блок, который указывает на конкретный файл со страницей обслуживания
error_page 503 =200 @maintenance;
location @maintenance {
root /var/www/html;
rewrite ^(.*)$ /maintenance.html break;
}
# ------------------------------------------------------
# Тут то, что было в блоке после ...
}
И аналогично предыдущему примеру, после этого выполни:
nginx -t && nginx -s reload
Как проверить что все работает?
Чтобы перевести хост в состояние "на тех. обслуживании", выполни команду:
touch /var/www/html/maintenance.flag
Чтобы снять его с него и прекратить показывать страницу формата "у нас ТО":
rm /var/www/html/maintenance.flag
При этом, никакие службы перезапускать не нужно.
Дата обновления мануала: 23.08.25