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

Nginx: режим обслуживания с проверкой «является разработчиком»

Это много варианты описано в Интернете, как отобразить страницу обслуживания с помощью nginx. Но я не нашел решения, чтобы проверить, является ли пользователь разработчиком, и не отображать страницу обслуживания для разработчиков.

Я использую try_files, который не работает как мне нужно после ввода любого IF-раздела. Итак, я сделал собственное решение, которым хочу поделиться. Работает в любой конфигурации с try_files, прокси и так далее.

У меня довольно простая настройка сервера, для которой конфигурация в конце ответа будет делать следующее:

  1. Если файл с именем MAINTENANCE существует на один уровень выше корневого, то сервер будет в режиме обслуживания. (Это -f тест).

  2. За исключением того, что если существует файл cookie с именем foo_dev со значением secret!, описанная выше проверка будет пропущена, и nginx будет обслуживать данные, как если бы сервер не был в режиме обслуживания. (Это $cookie_foo_dev = "secret!" тест.)

Я пробовал с некоторыми try_files настройки и не столкнулся с какими-либо проблемами.

Вот конфигурация.

server {
    # ... omitted stuff that does not pertain to the solution ...

    root <some path>;

    if ($cookie_foo_dev = "secret!") {
        break;
    }

    if ( -f $document_root/../MAINTENANCE) {
       return 503;
    }

    error_page 503 @maintenance;
    location @maintenance {
        rewrite ^(.*)$ /maintenance.html break;
    }

    location / {
        proxy_pass http://localhost:8000;
    }
}

Все входящие соединения должны использовать HTTPS, поэтому файлы cookie никогда не передаются в виде обычного текста через Интернет.

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

  1. В http раздел (из любого server раздел) проверьте пользователя, если он разработчик:

    map $http_cookie $isDevHack {
        default "";
        ~DEVELOPER_SECRET=1010 "/non-existed-location";
    }
    

    Пользователь является разработчиком, если у него DEVELOPER_SECRET с участием 1010 значение в этом случае. Эта карта доступна для всех серверов в config.

  2. Добавить server раздел с обработчиком ошибок 503:

    error_page 503 @maintenance;
    location @maintenance {
         rewrite ^(.*)$ /maintenance-mode.html break;
    }
    

    maintenane-mode.html - это страница, отображаемая для пользователей, не являющихся разработчиками, в режиме обслуживания. Путь к файлу относительно document_root текущего server.

  3. В location разделы, которые должны быть защищены в режиме обслуживания, добавляются перед любыми правилами нормального режима:

    if (-f "$isDevHack/home/site-home/maintenance") {
        return 503;
    }
    

    Если текущий пользователь является разработчиком, перед именем отмеченного файла будет стоять /non-existed-location префикс и if никогда не будет введен.