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

Proxy_pass все запросы для определенного IP-адреса, но обслуживает статический файл для всех остальных IP-адресов.

У меня есть прокси-сервер nginx перед моим веб-приложением. Я хочу обновлять приложение время от времени, и во время обновления я хочу, чтобы пользователи видели статическую страницу, которая информирует их о том, что приложение простаивает. До этого момента никаких проблем.

Теперь я также хочу протестировать приложение с помощью тестовой среды пользовательского интерфейса, которая потребует доступа к приложению во время простоя. Примечание: сейчас я не могу позволить себе установку тестового сервера.

У меня есть виртуальная машина, на которой выполняются тесты пользовательского интерфейса, поэтому я хотел бы изменить конфигурацию nginx, чтобы только эта виртуальная машина могла получить доступ к веб-сайту, а все остальные IP-адреса обслуживались статической страницей.

Мой основной подход заключался бы в использовании оператора if внутри серверного блока, который говорит, если $remote_addr нет, тогда используйте статические файлы с try_files. В противном случае (в случае ВМ) весь трафик идет одинаково.

Я пробовал разные решения, но простые из них просто невозможно реализовать, например, поставить try_files директива внутри оператора if.

Я также попытался переписать URL-адрес, если он поступает с других IP-адресов, а не с виртуальной машины, но это означает, что все запросы css и jpg также будут перезаписаны. В итоге я получил что-то вроде этого:

location ~* ^.+\.(jpg||png|css)$ 
{
    try_files $uri = 404;
}

if ( $remote_addr !~* <VM IP> ) {
  rewrite ^ https://example.com/static.html; 
}  

location /static.html
{
    try_files $uri /static.html = 404;
}
location /
{
# headers
proxy_pass <internal-server>; 
} 

Это HACK IMO, и на самом деле он даже не работает. Я ищу другое и более простое решение от того, кто делал что-то подобное раньше.

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

Итак, опять же, основная проблема заключается в перенаправлении всего трафика на статическую страницу, если IP-адрес не указан. (URL-адреса запросов могут быть одинаковыми, поэтому решения на основе местоположения для меня не подходят)

Вы можете упростить конфигурацию, поместив весь статический контент под общий префикс URI (например, /maintenance/...).

Например:

location / {
    if ($remote_addr != '1.2.3.4') {
        rewrite ^ /maintenance/ last;
    }
    ...
    proxy_pass ...;
}
location /maintenance/ {
    root /path/to/root;
    index index.html;
}

Страница обслуживания находится по адресу /path/to/root/maintenance/index.html. Файлы ресурсов расположены в одном каталоге и доступны с использованием относительных URI (например, foo.css) или с префиксом (например, /maintenance/foo.css).