É possível ter diretivas proxy_remote_match dinâmicas no apache2 ou contornar isso de alguma forma?

1

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.

    
por The Shurrican 05.01.2012 / 17:56

1 resposta

1

Dado que o loop seguinte (perl, mas idioma 'yyyyy') faria

foreach my $i (1..200) { 
  print "ProxyRemoteMatch .*\.$i\.server\.mysite\.com.* http://$1.server.mysite.com:80\n";
}

imprime toda a parte de configuração longa e repetitiva, por que se incomodar? Você pode manter a coisa toda com uma única linha. Você pode até usar Incluir para varrê-lo do arquivo de configuração completamente. Provavelmente trazer 'make' na imagem permitiria que ele fosse executado automaticamente sempre que você adicionasse / removesse um servidor.

    
por 05.01.2012 / 18:15