Хотелось сделать примерно то же самое на базе Nginx/Angie, но с помощью файла-флага, который можно положить в корень сайта и это будет включать режим обслуживания. Если файл есть – весь трафик пользователей идёт на заглушку, а IP адреса разработчиков или какие-то подсети видят сайт как обычно и работают с ним.
Задача в целом популярная, в сети легко находятся готовые примеры. Но там везде используется
if. Хотелось сделать без него, но у меня не получилось. Долго мучал chatgpt. Он бодро предлагал неработающие решения, потом так же бодро сообщал, что действительно тут ошибка и так не работает. Надо делать вот так и тогда получится. В итоге простого красивого и удобного решения именно с файлом-флагом, без правки конфигурации и reload веб сервера сделать не получилось. Реализовал наиболее простой вариант с помощью пары if. Создаём файл
/etc/angie/allowed_ips.conf следующего содержания:map $remote_addr $bypass_maintenance {
default 0;
187.192.238.175 1;
192.168.0.0/24 1;
}Указывать можно как одиночные IP адреса, так и подсети. Вынес эти настройки в отдельный файл для удобства. Добавляем в настройки виртуального хоста, для которого настраиваем режим обслуживания:
location = /maintenance.html {
try_files $uri =503;
}
location / {
set $in_maintenance 0;
if (-f $document_root/maintenance.flag) {
set $in_maintenance 1;
}
set $maintenance_check "${in_maintenance}_${bypass_maintenance}";
if ($maintenance_check = "1_0") {
return 302 /maintenance.html;
}
try_files $uri $uri/ /index.php?$args;
}Теперь если в корне сайта создать файл
maintenance.flag, то всем пользователям, кого нет в списке allowed_ips.conf будет отображаться содержимое файла maintenance.html, который надо добавить.Это максимально простой и быстрый вариант. Но столкнулся с небольшим нюансом. Когда обслуживание закончено, желательно пользователей, кто остался на странице maintenance.html обратно вернуть на главную, когда они в очередной раз обновят страницу. Добавляем проверку в
location /maintenance.html location = /maintenance.html {
if (!-f $document_root/maintenance.flag) {
return 302 /;
}
try_files $uri =503;
}Получилось относительно простое и эффективное решение. Не надо менять конфигурацию и дёргать веб сервер. Достаточно любым способом положить или переименовать заготовку для файла maintenance.flag, а потом обратно переименовать, когда работы закончены.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
#nginx #angie
