У меня есть прокси-сервер 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
).