@Vodol

Умеет ли load balancer в Nginx проксировать на URL (не IP)?

Всем привет. Возникла проблема с Nginx.
Сейчас у меня проксирование настроено таким образом:
есть location /folder
он ведет на proxy_pass https://site2.ru.

Как результат, я захожу на site1.ru/folder, а открывается содержимое site2.ru. С этим проблем нет.

Но появилась необходимость сделать балансировку: захожу на site1.ru/folder, а открывается содержимое site2.ru или site3.ru. Я дополнил конфигурацию следующим образом:

upstream backend {
        server site2.ru;
        server site3.ru;
    }


Оказалось, что в таком виде Nginx проксирует запрос не на домен, а на его IP, и не в корневую директорию как раньше, а в /folder. То есть вместо https://site2.ru он идет на https://111.11.11.11/folder.

Можно ли как-то мою проблему решить?

Полная конфигурация:

upstream backend {
        server site2.ru;
        server site3.ru;
    }

server{
  listen 80;
  server_name site1.ru;

  location /folder {
        proxy_pass https://backend;
        proxy_ssl_server_name on;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header Connection "upgrade";
      }
}
  • Вопрос задан
  • 122 просмотра
Пригласить эксперта
Ответы на вопрос 2
fzfx
@fzfx
18,5 дм
Оказалось, что в таком виде Nginx проксирует запрос не на домен, а на его IP

Раскройте вашу проблему касаемо этого. Nginx всегда проксирует запрос на IP, другое дело, что если вместо IP указано доменное имя и оно нормально резолвится, а в nginx задана директива resolver, то по доменному имени Nginx вполне себе сможет получить IP для проксирования. Раскройте, что имеется ввиду под тем, что у вас проблема с тем, что "Nginx проксирует запрос не на домен, а на его IP"?
Возможно вы имели ввиду то, что без передачи заголовка Host с именем домена целевого бекенда у вас не работает проксирование, потому что бекенды ожидают запросов только на отдельные доменные имена, отличающиеся от основного и друг от друга? Вообще обычно так не делают, и бекенды настраивают на работу с тем же доменным именем, что используется на фронте, но если прям очень надо, то в таком случае следует заменить блок upstream на блок split_clients:
split_clients $request_uri $site_backend {
              50%          site2.ru;
              *            site3.ru;  
}

Добавить перезапись заголовка Host:
proxy_set_header Host $site_backend;
И поправить директиву proxy_pass:
proxy_pass https://$site_backend;

и не в корневую директорию как раньше, а в /folder.

А это потому что вы умудрились потерять концевой слеш в директиве proxy_pass.
Ответ написан
Добавьте в конфиг локации еще и заголовок явно
location /folder {
        proxy_pass https://backend;
        proxy_ssl_server_name on;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header Connection "upgrade";
      }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы