Re: Embedded perl совместно с проксированием

Maxim Dounin mdounin на mdounin.ru
Ср Авг 10 21:36:29 UTC 2011


Hello!

On Thu, Aug 11, 2011 at 12:48:25AM +0400, Vladimir Stackov wrote:

> Приветствую,
> возникло желание использовать встроенный перл совместно с директивой
> proxy_pass, то есть сначала производит некоторые манипуляции вызываемый
> модуль перла, а затем запрос, в случае возврата DECLINED, переходит к
> бэкэнду.
> 
> Но оказалось, что не так всё просто:
> всё дело в том, что если директива на выполнение модуля перла находится
> перед директивой proxy_pass (i.e. perl smth:sub;\nproxy_pass
> http://..;), то в этом случае модуль просто не исполняется. Если же
> наоборот, то есть proxy_pass перед perl, то в этом случае perl не
> вызывается.

И perl, и proxy_pass - устанавливают безусловный обработчик для 
location'а.  Обработчик один, кто последний его переписал на себя 
- от того и будет использоваться.

При возврате DECLINED обработка переходит в цепочку стандартных 
content-модулей (gzip_static, static, index, autoindex и т.д.)...

> В случае, если в локейшене используется отдача статики с директивой
> root, то всё работает корректно.

... и с ними, действительно, работает.

> В качестве простейшего решения проблемы решил сделать возврат из модуля
> кода ошибки 505, если требуется передача запроса к бэкэнду:
> 
> location / {
>  perl cp::handler;
>  error_page 505 = @index;
> }
> 
> location @index {
>  proxy_pass http://127.0.0.1:8197;
> }
> 
> Является ли подобное исключающее взаимодействие директив proxy_pass и
> perl нормой и если да, то какие возможные пути обхода наиболее
> корректны, кроме вышеприведённого и танцев с бубном при использовании
> proxy_set и условий для передачи в бэкенд?

Наиболее корректно, видимо, будет делать $r->internal_redirect() 
из перла.

Впрочем, возврат ошибки + error_page тоже вполне рабочее решение.

Maxim Dounin



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