proxy_redirect & $vars

Maxim Dounin mdounin на mdounin.ru
Вт Ноя 9 15:37:59 MSK 2010


Hello!

On Tue, Nov 09, 2010 at 02:42:28PM +0300, Alex L. Demidov wrote:

> Есть nginx front-end, который слушает на всех хостах вида
> ^[0-9]+.example.com и делает proxy_pass на 127.0.0.0 и порт
> соответствующий поддомену example.com, например, при обращении к
> 12345.example.com идет proxy_pass к 127.0.0.1:12345. На 127.0.0.1
> могут слушать сотни и тысячи портов, которые на самом деле
> туннелятся на внешние железки, отвечающие по http, причем эти
> туннели могут динамически появляться и пропадать.
> 
> Проблема собственно в том, что одна из этих железок выдает 302
> Redirect, которые нужно переписать, но proxy_redirect не понимает
> переменные в первом параметре, как в примере ниже, где
> закомментировано:
> 
> -----------------------------------------------------------------------
> 
> http {
>     perl_set $decoded_port '... 
>          perl code to extract prefix from Host: header
>     ...';
> 
>     server {
>         listen       80;
>         server_name  ~^[0-9]+\.example\.com;
> 
>         location / {
>             proxy_pass         http://127.0.0.1:$decoded_port;
> 
> #           proxy_redirect     http://127.0.0.1:$decoded_port/ \
> #                              http://$decoded_port.example.com/;
>             proxy_redirect     http://127.0.0.1:12345/          \
>                                http://$decoded_port.example.com/;
>         } 
>     }
> }
> -----------------------------------------------------------------------
> 
> Вопросы: 
> 
> Есть ли какие-либо варианты переписать Redirect в данной ситуации?

Можно ещё попробовать через proxy_hide_header + 
proxy_intercept_errors + error_page 302 + add_header.

> Если нагенерировать 64K строчек со всеми портами - не упрусь ли я в
> какие-либо ограничения?

Нет, но применение proxy_redirect'ов делается до первого 
совпадения, так что 64k строк - это не очень оптимальное решение.

> Возможно ли отпатчить сам nginx чтобы он понимал $vars в
> первом параметре proxy_redirect и нет ли каких-то принципиальных
> ограничений для этого? 
> 
> Правильно ли я понимаю, что патчить надо функцию
> ngx_http_proxy_rewrite_redirect_vars в файле
> src/http/modules/ngx_http_proxy_module.c ?

Там патчить больше чем одну функцию, но в целом направление 
верное.

Maxim Dounin



Подробная информация о списке рассылки nginx-ru