Nginx proxy_next_upstream с другой модификацией URI - PullRequest
0 голосов
/ 23 января 2019

Нам нужно настроить несколько вышестоящих серверов и использовать proxy_next_upstream для резервного копирования, если главный сервер возвращает 404. Однако URI для вышестоящего резервного сервера отличается от URI для основного сервера, поэтому Я не знаю, возможно ли это.

Подробно, приведенный ниже фрагмент конфигурации работает нормально (если URI одинаковы для всех вышестоящих серверов):

upstream upstream-proj-a {
   server server1.test.com;
   server server2.test.com backup;
}

server {
    listen 80;
    listen [::]:80;

    server_name www.test.com;
    location /proj/proj-a {

        proxy_next_upstream error timeout http_404;

        proxy_pass http://upstream-proj-a/lib/proj/proj-a;
}

Для запроса http://test.com/proj/proj-a/file, он сначала попытается запросить http://server1.test.com/lib/proj/proj-a/file,, если вернет 404 или тайм-аут, затем попытайтесь http://server2.test.com/lib/proj/proj-a/file. Это хорошо.

Однако теперь для сервера 2 он может принимать только URL-адреса, такие как http://server2.test.com/lib/proj/proj-a-internal/file,, которые отличаются от URI для основного сервера. Если только с учетом резервного сервера, я могу написать так:

proxy_pass http://server2.test.com/lib/proj/proj-a-internal

Однако, похоже, у меня не может быть разных proxy_pass для разных вышестоящих серверов, объединяющих proxy_next_upstream.

Как мне этого добиться?

1 Ответ

0 голосов
/ 25 января 2019

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

Конфигурация как ниже:

upstream upstream-proj-a {

   server server1.test.com:9991;
   # Use localhost as backup
   server localhost backup;
}

server {
    listen 80;
    listen [::]:80;

    resolver 127.0.1.1;

    server_name www.test.com;

    location /lib/proj/proj-a {
        # Do rewrite then proxy_pass to real upstream server
        rewrite /lib/proj/proj-a/(.*) /lib/proj/proj-a-internal/$1 break;
        proxy_pass http://server2.test.com:9992;
    }

    location /proj/proj-a {
        proxy_next_upstream error timeout http_404;
        proxy_pass http://upstream-proj-a/lib/proj/proj-a;
    }
}

Работает нормально, но единственным побочным эффектом является то, что, когда запрос должен перейти на сервер резервного копирования, он создает еще один новый HTTP-запрос от localhost к localhost, который, кажется, удваивает нагрузку на nginx. Цель состоит в том, чтобы передавать довольно большие файлы, и я не уверен, влияет ли это на производительность или нет, особенно если все протоколы - https вместо http.

...