Apache 2.2: RewriteMap, interpolação ProxyPass e Keep-Alive

2

Eu tenho um httpd Apache usado como um frontend de proxy reverso SSL para muitos backends. Eu computo o nome do backend do caminho dado pelo usuário. por exemplo: https://myhostname.com/myaccount é traduzido como http://myaccount.myhostname.com

Para isso, uso um sinal RewriteMap e RewriteRule with [P] ativado. Tudo funciona bem.

No entanto, agora preciso de uma conexão persistente entre o proxy reverso e o back-end. Estou ciente de que o keep-alive não funciona com RewriteRule ([P] "> link - aviso de desempenho), portanto, tentei usar ProxyPass e interpolação de variável de ambiente para fazer o trabalho. Eu tenho um RewriteRule que não faz nada, exceto salvar o resultado do mapa em uma variável de ambiente e, em seguida, chamar o ProxyPass usando essa variável.

RewriteMap mymap prg:/path/to/my/map
RewriteCond %{REQUEST_URI} ^/([^/]+)/?.*$
RewriteCond ${mymap:%1} ^http://([^/]+/)$
RewriteRule ^/([^/]+)/?$ - [L,E=original:$1,E=rewritten:%1]

ProxyPassInterpolateEnv On
ProxyPassReverse /${original}/ http://${rewritten} interpolate

Esse resultado tem o mesmo comportamento de RewriteRule com [P] : o proxy está ok, mas não usa http keep-alive.

Eu tentei isso com um nome de host embutido em vez de usar ${rewritten} (mas mantendo o ${original} ) e observei que essa é a parte que faz o Apache criar uma nova conexão em vez de reutilizar uma existente.

Este bug: link está levantando o mesmo problema e propõe um patch que pode resolver minha problema.

No entanto, eu queria saber se alguém teve uma ideia para resolver isso de uma maneira diferente / melhor.

    
por Julien 30.01.2013 / 15:26

1 resposta

0

Ao usar o sinalizador [P] em um RewriteRule para o proxy, você normalmente seria capaz de usar a diretiva ProxySet para definir as opções normalmente configuradas por meio de ProxyPass .

Mas, neste caso, você não tem um URL de proxy específico para configurar. Se você estiver apenas fazendo proxy das contas de usuário, poderá fazer algo como:

ProxyPassMatch /\w+/ http://$1.myhostname.com/ keeplive=on

Embora, a partir do seu exemplo, pareça possível, diferentes domínios estão em uso (daí o uso de um RewriteMap ).

Alternativamente, outro pensamento que acabou de ocorrer, pode funcionar para usar o seguinte (não testado):

<Proxy *>
    ProxySet keepalive=on
</Proxy>
    
por 01.10.2016 / 22:51