Apache proxy_http redireciona para ip e define hostname

16

espero que vocês possam me ajudar com um problema de proxy que eu tenho.

O que eu já tenho

Eu configurei um proxy reverso http apache, para solicitações de proxy de * .proxy.domain a * .intern.domain. O apache é a única maneira de acessar meus aplicativos da web internos a partir de uma rede externa.

Exemplo:

app.proxy.domain -> app.intern.domain
mail.proxy.domain -> mail.intern.domain

Isso tudo está funcionando muito bem, mas tenho o seguinte problema.

Problema
Desejo fazer o proxy dos seguintes pedidos:

app.proxy.domain -> app.internal.domain
app-dev.proxy.domain -> app-dev.internal.domain

Isso não é problema, mas infelizmente o servidor app-dev executa uma cópia exata do aplicativo da web dos servidores de aplicativos, e esse aplicativo da web responde apenas ao nome do host (app.intern.domain)

Então, o que eu preciso fazer é proxy o seguinte

app.proxy.domain -> app.internal.domain (10.0.1.1)
app-dev.proxy.domain -> app.internal.domain (10.0.1.2)

Eu posso fazer a segunda coisa, adicionando "10.0.1.2 app.internal.domain" em / etc / hosts, mas isso também significa que app.proxy.domain chegará ao servidor dev.

Estou procurando por uma opção, para definir a entrada / etc / hosts somente dentro do arquivo de configuração do vhost para app-dev.proxy.domain, para que todas as outras configurações do vhost usem apenas o DNS para app.intern.domain.

Pensamentos...

Existe uma maneira de dizer ao apache config, para

ProxyPass / http://10.0.1.2/

mas enviar app.intern.domain como nome do host?

Editar o aplicativo da web dev-servers para ouvir o app-dev não é uma opção, pois ele deve ser uma cópia exata (não é minha decisão ...)

Obrigado!

mohrphium
fonte

Respostas:

34

Possivelmente você pode usar mod_headers em conjunto com mod_proxy. Eu não testei embora.

Portanto, para o seu app-dev vhost, você pode ter:

RequestHeader set Host "app.internal.domain"

e então você adicionaria:

ProxyPreserveHost On
Piotr
fonte
2
A configuração ProxypreserveHost fez o truque perfeitamente. Obrigado!
Some Linux Nerd
3

Solução alternativa feia é usar (em vez de: abusar) os / etc / hosts para apontar app.internal.domain para localhost e, em seguida, configurar o Apache para ouvir duas portas adicionais, uma para cada app e app-dev. Então, proxy reverso duas vezes:

Listen 80
Listen 127.0.0.1:8001
Listen 127.0.0.1:8001

<VirtualHost *:80>
   ServerName app.proxy.domain
   ProxyPass / http://app.internal.domain:8001
</VirtualHost>
<VirtualHost *:80>
   ServerName app-dev.proxy.domain
   ProxyPass / http://app.internal.domain:8002
</VirtualHost>
<VirtualHost 127.0.0.1:8001>
   ServerName app.internal.domain
   ProxyPreserveHost On
   ProxyPass / http://10.0.1.1/
</VirtualHost>
<VirtualHost 127.0.0.1:8002>
   ServerName app.internal.domain
   ProxyPreserveHost On
   ProxyPass / http://10.0.1.2/
</VirtualHost>
HBruijn
fonte
2

Adicione à configuração do proxy reverso (foe app-dev.proxy ..):

RequestHeader edit Host ^app-dev.proxy.domain app.proxy.domain

Você deve habilitar o mod_headers antecipadamente:

a2enmod headers

O servidor interno 10.0.1.2 deve ter

ServerName app.proxy.domain
grafzero
fonte