Apache: Proxy baseado em sufixos de URL

1

Minha equipe escreveu um servidor de BI interno, que gera relatórios HTML em links como /users/daily ou /updates/questions .

O servidor está escrito em Grails , e funciona perfeitamente com uma configuração clássica do Apache-Tomcat:

ProxyPass         /     http://localhost:8080/ nocanon
ProxyPassReverse  /     http://localhost:8080/

Então

https://example.com/users/daily

Éintermediadointernamentepara

http://localhost:8080/users/daily

EservidoapartirdoservletdoTomcat.

Oservidorébem-sucedidoeeugostariadeimplantá-lotrêsvezes,emtrêssistemasdiferentes,diferenciadosporumsufixodeURL(/dev,/stg,/prod):

Isso significa que https://example.com/dev/users/daily será intermediado por proxy a partir de http://localhost:8080/users/daily e https://example.com/prod/users/daily será atendido a partir de http://localhost:8082/users/daily .

Eu tentei algumas regras do Apache RewriteRule s e ProxyPass , mas não consegui encontrar uma combinação de trabalho.

Como posso fazer o roteamento interno baseado em sufixos no Apache com links internos?

    
por Adam Matan 11.08.2014 / 10:05

1 resposta

3

Você pode fazer isso com

<Location /dev>
  RewriteEngine on
  RewriteRule  ^/dev/(.*)  /$1
  ProxyPass         /  http://localhost:8080/ nocanon
  ProxyPassReverse  /  http://localhost:8080/
</Location>

e assim por diante. Isso fornecerá a você proxies diferentes para as diferentes URLs e removerá os principais / dev, / staging ou / prod das URLs.

Mas há um problema: links no HTML que estão voltando do Tomcat terão uma base de URL de /, não / dev etc. Para adicionar o prefixo de volta ao HTML, você terá que usar mod_proxy_html ou um equivalente para analisar o HTML, modificá-lo e montá-lo novamente. Isso pode funcionar, mas há um custo de desempenho; HTML mal formado pode ser mutilado; você terá que reescrever URLs em CSS e Javascript também; e o Javascript pode ser impossível de acertar.

Outra opção que pode ser mais fácil: criar novos nomes de host no DNS: dev.biserver.example.com, staging.biserver.example.com e prod.biserver.example.com. Então a reescrita da URL desapareceria e você poderia fazer tudo com hosts virtuais, por exemplo:

<VirtualHost *:443>
  ServerName dev.biserver.example.com
  ProxyPass         /  http://localhost:8080/ nocanon
  ProxyPassReverse  /  http://localhost:8080/
</VirtualHost>

e assim por diante.

    
por 11.08.2014 / 10:41