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