Skip to main content

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