proxy_redirect & $vars
Alex L. Demidov
alexeydemidov на gmail.com
Пн Ноя 15 15:12:29 MSK 2010
On Tue, Nov 09, 2010 at 03:37:59PM +0300, Maxim Dounin wrote:
> 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.
Спасибо за подсказку, этот вариант совсем не очевиден, тем более в
документации написано что proxy_intercept_errors работает только для
HTTP status >= 400. Еще один недостаток документации - описание
переменных разбросано по разным модулям, поэтому я долго думал, как
достать из встроенного perl'а заголовок Location в ответе, пока не
догадался посмотреть в документацию модуля upstream.
>
> > Если нагенерировать 64K строчек со всеми портами - не упрусь ли я в
> > какие-либо ограничения?
>
> Нет, но применение proxy_redirect'ов делается до первого
> совпадения, так что 64k строк - это не очень оптимальное решение.
Да, по тестам у меня вышло что вариант с intercept втрое быстрее
варианта с 64K proxy_redirect'ов.
--
Alex L. Demidov (ALD9-RIPE).
http://alexeydemidov.com/
Freelance Consulting.
Подробная информация о списке рассылки nginx-ru