Apache proxy_http redirige vers ip et définit le nom d'hôte

16

j'espère que vous pouvez m'aider avec un problème de proxy que j'ai.

Ce que j'ai déjà

J'ai mis en place un proxy inverse http apache, pour les requêtes proxy de * .proxy.domain vers * .intern.domain. L'apache est le seul moyen d'accéder à mes applications web internes depuis un réseau externe.

Exemple:

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

Tout cela fonctionne très bien, mais j'ai le problème suivant.

Problème
Je souhaite proxy les demandes suivantes:

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

Ce n'est pas un problème, mais malheureusement, le serveur app-dev exécute une copie exacte de l'application Web des serveurs d'applications, et cette application Web ne répond qu'à son nom d'hôte (app.intern.domain)

Donc, ce que je dois faire, c'est proxy

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

Je peux faire la deuxième chose, en ajoutant "10.0.1.2 app.internal.domain" dans / etc / hosts, mais cela signifie également que app.proxy.domain atterrira sur le serveur de développement.

Je recherche une option pour définir l'entrée / etc / hosts uniquement dans le fichier de configuration vhost pour app-dev.proxy.domain, de sorte que chaque autre configuration vhost utilise simplement DNS pour app.intern.domain.

Pensées...

Existe-t-il un moyen de dire à apache config,

ProxyPass / http://10.0.1.2/

mais envoyer app.intern.domain comme nom d'hôte?

Modifier l'application web dev-servers pour écouter app-dev n'est pas une option, car elle est censée être une copie exacte (pas ma décision ...)

Merci!

mohrphium
la source

Réponses:

34

Vous pourriez éventuellement utiliser mod_headers en conjonction avec mod_proxy. Je ne l'ai pas testé cependant.

Donc, pour votre vhost app-dev, vous pourriez avoir:

RequestHeader set Host "app.internal.domain"

puis vous ajouteriez:

ProxyPreserveHost On
Piotr
la source
2
Le paramètre ProxypreserveHost a parfaitement fait l'affaire. Merci!
Certains Linux Nerd
3

La solution de contournement laide consiste à utiliser (plutôt: abuser) le / etc / hosts pour pointer app.internal.domain vers localhost, puis configurer Apache pour écouter deux ports supplémentaires, un pour chaque application et développeur d'application. Donc inverser le proxy deux fois:

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
la source
2

Ajouter à la configuration du proxy inverse (foe app-dev.proxy ..):

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

Vous devez préalablement activer mod_headers:

a2enmod headers

Le serveur interne 10.0.1.2 devrait avoir

ServerName app.proxy.domain
grafzero
la source