Apache como proxy reverso para vários destinos e um destino padrão

4

Procurando ajuda para o próximo problema reverse-proxy do Apache.

  • tem um Apache 2.4 no localhost: 80 (a.a.a.a: 80)
  • tem três aplicativos da web diferentes
    • um é executado em localhost: 8000 (a.a.a.a: 8000)
    • outros dois estão em outras máquinas - então x.x.x.x: 8000 e y.y.y.y: 8000
  • tem algum conteúdo estático (poucas páginas html) no apache básico: 80 's DocumentRoot

Requisitos :

  • appX (no x.x.x.x: 8000) deve ser acessado pelo link
  • appY (no y.y.y.y: 8000) como link
  • páginas estáticas existentes (do DocumentRoot do apache) devem ser exibidas normalmente pelo apache
  • defapp - tudo outro deve ser proxiedado para a.a.a.a: 8000

É fácil configurar o appX e appY da seguinte forma:

ProxyPass         /appX/ http://x.x.x.x:8000/
ProxyPassReverse  /appX/ http://x.x.x.x:8000/

ProxyPass         /appY/ http://y.y.y.y:8000/
ProxyPassReverse  /appY/ http://y.y.y.y:8000/

O acima funciona OK. Então, quando tentei acessar http://localhost/appX/ obteve uma resposta do appX no x.x.x.x:8000 .

Mas tenha um problema com o default destinaton para everything other . Quando tentou adicionar:

ProxyPass         /   http://127.0.0.1:8000/
ProxyPassReverse  /   http://127.0.0.1:8000/

Não funciona como espero ...

Com o acima quero dizer ao apache - tudo o que não é /appX/ ou /appY/ enviar para 0:8000 .

E isso infelizmente não funciona, o defapp executado em 0:8000 recebeu as solicitações para appX e appY e as solicitações para as páginas estáticas também.

Mudando a ordem das definições, então

#define first the "default destination"
ProxyPass         /   http://127.0.0.1:8000/
ProxyPassReverse  /   http://127.0.0.1:8000/

#and after the appX and appY
ProxyPass         /appX/ http://x.x.x.x:8000/
ProxyPassReverse  /appX/ http://x.x.x.x:8000/
ProxyPass         /appY/ http://y.y.y.y:8000/
ProxyPassReverse  /appY/ http://y.y.y.y:8000/

também não funciona. Tudo está em proxy para localhost:8000 .

Então, a questão é: é possível configurar o Apache como um proxy reverso para manipular os requisitos acima definidos?

    
por kobame 09.04.2014 / 19:48

3 respostas

5

Quebra suas referências ProxyPass em uma definição <VirtualHost> , assim:

<VirtualHost *:*>
ProxyPreserveHost On
ProxyPass / http://192.168.111.2/
ProxyPassReverse / http://192.168.111.2/
ServerName hostname.example.com
</VirtualHost>

Crie dois nomes separados com o ServerNames desejado, depois outro sem o Nome do Servidor ou as opções de Proxy definidas (apenas DocumentRoot ). Coloque isso por último.

Mais informações aqui .

    
por 09.04.2014 / 20:19
0

Você pode usar regras de reescrita com o P bandeira .

As regras de reconfiguração são mais flexíveis do que as diretivas ProxyPass e você pode usar o sinalizador L para interromper o processamento do conjunto de regras e evitar o problema mencionado (acertar vários back-ends).

Veja um exemplo:

ProxyPreserveHost   On
RewriteEngine       On

RewriteRule         ^/app/(.*) http://127.0.0.1/$1 [P,L]
ProxyPassReverse    /app/ http://127.0.0.1/app

RewriteRule         ^/blog/(.*) http://127.0.0.1/blog/$1 [P,L]
ProxyPassReverse    /blog/ http://127.0.0.1/blog

RewriteRule         ^/(.*) http://127.0.0.1/$1 [P,L]
ProxyPassReverse    / http://127.0.0.1
    
por 13.03.2015 / 18:56
0

Pequeno impacto à resposta de Warren Seine (falta de "app /" no primeiro RewriteRule (.... 127.0.0.1/$1 [P ....))

RewriteRule         ^/app/(.*) http://127.0.0.1/$1 [P,L]

deve ser

RewriteRule         ^/app/(.*) http://127.0.0.1/app/$1 [P,L]

Então, resumindo - No caso de todos os seus links serem distribuídos entre vários hosts (com precisão, como no seu caso), tente isto:

ProxyPreserveHost   On
RewriteEngine       On

RewriteRule         ^/appX/(.*) http://x.x.x.x:8000/$1 [P,L]
ProxyPassReverse    /appX/      http://x.x.x.x:8000/
RewriteRule         ^/appY/(.*) http://y.y.y.y:8000/$1 [P,L]
ProxyPassReverse    /appY/      http://y.y.y.y:8000/
RewriteRule         ^/(.*)      http://127.0.0.1:8000/$1 [P,L]
ProxyPassReverse    /           http://127.0.0.1:8000

No caso de precisar espalhar seus links no único host (com diferentes portas & BaseURLs)

ProxyPreserveHost   On
RewriteEngine       On

RewriteRule         ^/appX/(.*) http://127.0.0.1:8001/appX/$1 [P,L]
ProxyPassReverse    /appX/      http://127.0.0.1:8001/appX
RewriteRule         ^/appY/(.*) http://127.0.0.1:8002/appY/$1 [P,L]
ProxyPassReverse    /appY/      http://127.0.0.1:8002/appY/
RewriteRule         ^/(.*)      http://127.0.0.1:8000/$1 [P,L]
ProxyPassReverse    /           http://127.0.0.1:8000
    
por 11.08.2017 / 23:06