proxy_redirect, upstream и оптимальная конфигурация

Стояновский Анатолий Александрович skyer at rian.ru
Tue Aug 26 14:08:15 MSD 2008


Вопрос наверное сразу к Игорю Сысоеву.

Есть у меня конфигурация, где директива proxy_redirect не может сделать то,
что от нее требуется, либо же я не вижу пути решения.

Есть фронтенд, который обслуживает много сайтов. У каждого сайта есть много
бакендов, описанных через upstrem. Соответственно, нужно конвертировать
редиректы бакенда на фронтенд, причем на тот же Host, на который пришел
пользователь.

Хочется сделать это одной директивой на уровне http.

proxy_redirect default в случае групп серверов за имя хоста понимает не
бакенд, а имя группы. И бог бы с ним, бакенд может возвращать считать имя
группы за основное имя и делать редиректы туда, то похоже при этом порт
всегда  равен 80 (и такое значение в переменной $proxy_port). Бакенд же
висит на другом порту, его номер описан в группе, и переписывания редиректа
не происходит.
Пример:
Upstream backend {
    server backend1:8000;
}

Proxy_pass http://backend;

Location: http://backend:8000/uri
не переписывается, т.к. считается, что порт в proxy_pass не равен порту
настоящего сервера, даром что домены сходятся.

Но даже если бы default угадывал реальный порт, default использует в
качестве переписанного имени $server_name, а хотелось бы $http_host, т.к.
пользователи могут приходить на фронтенд по разным доменам и важно оставлять
их на том же домене и после редиректа.

Поэтому приходится писать в каждом описании сервера

proxy_redirect http://backend:port http://$http_host:$server_port

что в принципе работает, но увеличивает количество необходимых
конфигурационных действий для добавления новых сайтов или координации при
изменении адреса сайта. Мне кажется, если бы можно было использовать
переменные в исходной строке, и $proxy_name/$proxy_port указывали на
реальный бакенд, можно было бы написать

proxy_redirect http://$proxy_host:$proxy_port http://$http_host:$server_port



 






More information about the nginx-ru mailing list