Estou executando um proxy de encaminhamento, no qual desejo encaminhar determinadas solicitações para diferentes servidores proxy usando o ProxyRemote. Qual solicitação vai para qual servidor depende de muitos fatores (tempo, carga, url, host, usuário, ...) e tem que ser calculado por um programa externo.
O processo atualmente funciona adicionando-se sufixo ao host do URL de solicitação, que é então correspondido pelas diretivas ProxyRemoteMatch. isso é doen passando o URL para um mapa de reescrita.
Isso funciona legal, mas tem o trade de que tenho que definir CADA servidor na configuração e no DNS.
Aqui está um exemplo de trabalho:
RewriteEngine on
// define an external program that contains the logic where which request should be routed to
RewriteMap balancemap prg:/home/mysite/balancemap.php
<ProxyMatch "http://.*">
RewriteEngine on
// if the route has not yet been set by suffix proxy pattern, pass the request uri and user to the mapping program and store it in an environment variable
// for example http://google.com will be rewritten to something like http://google.com.5.server.mysite.com - which means it should be routed over server number 5
RewriteCond %{HTTP_HOST} !\.([0-9]+)\.server\.mysite\.com$
RewriteCond ${balancemap:%{REQUEST_URI}#%{REMOTE_USER}} .*
RewriteRule .* - [E=BALANCEDURL:%0]
// if a new url has been calculated, rewrite to it
RewriteCond %{ENV:BALANCEDURL} .+
RewriteRule .* %{ENV:BALANCEDURL} [P]
</ProxyMatch>
// now comes the long ist of servers....
// every subdomain is mapped to the correct ip address in internal dns system
ProxyRemoteMatch .*\.1\.server\.mysite\.com.* http://1.server.mysite.com:80
ProxyRemoteMatch .*\.2\.server\.mysite\.com.* http://2.server.mysite.com:80
ProxyRemoteMatch .*\.3\.server\.mysite\.com.* http://3.server.mysite.com:80
ProxyRemoteMatch .*\.4\.server\.mysite\.com.* http://4.server.mysite.com:80
... and so on
Basicamente, o que eu desejo seria um ProxyRemoteDirective que suporte referências anteriores como esta:
ProxyRemoteMatch .*\.(\d+)\.server\.mysite\.com.* http://$1.server.mysite.com:80
Ou eu poderia até dar o IP inteiro assim:
ProxyRemoteMatch .*\.(\d+)\.(\d+)\.(\d+)\.(\d+)/.* http://$1.$2.$3.$4:80
Para sua informação: A parte personalizada do nome do host é removida da url novamente nos servidores proxy de encaminhamento. Eu também gostaria de me livrar disso, passando a URL como está!
Portanto, se o segundo argumento da diretiva ProxyRemoteMatch interpolar a variável de ambiente, ele terá a seguinte aparência:
// now our map just returns the ip of the correct remote server
RewriteCond ${balancemap:%{REQUEST_URI}#%{REMOTE_USER}} .*
RewriteRule .* - [E=REMOVESERVER:%0]
ProxyRemoteMatch .* http://%{ENV:REMOVESERVER}:80
Isso seria mais incrível.
Mas infelizmente nenhum dos trabalhos acima.
Demorei um pouco para descobrir o sistema atual e agora tenho cerca de 200 linhas de diretivas ProxyRemoteMatch (200 servidores remotos). Mas mantendo tudo em dia 2 com dns e tudo é uma dor no rabo.
Maby você também pode recomendar uma alternativa? Provavelmente, o mesmo comportamento pode ser facilmente um com outro software de servidor proxy? Provavelmente Nginx? Lula?
Então, todas as ideias são bem vindas!
FYI isso é um projeto comercial, que no entanto eu corro sozinho e ele realmente não faz nenhum lucro notável agora. Eu pretendo torná-lo código aberto, mas executando o meu próprio serviço com ele uma vez estável.
Eu acho que também vou colocar uma recompensa sobre esta questão o mais rápido possível.