13 votes

Aidez-moi à comprendre comment utiliser ProxyPass

MISE À JOUR : J'ai ajouté une question révisée après avoir joué avec les deux réponses ci-dessous.

Bonjour,

Si vous lisez ces lignes, vous êtes probablement familier avec le mod_proxy d'Apache et sa fonction ProxyPass. Comme beaucoup d'autres, j'ai le problème d'avoir une application à laquelle je peux accéder depuis l'extérieur de notre réseau interne, mais cette application elle-même accède à d'autres applications internes sur des machines différentes, et lorsque vous avez accès à distance avec cette configuration, les choses se gâtent.

Donc, mon installation est très simple, j'ai :

L'accès à distance de la machine n°1 est activé, j'y accède par un nom d'hôte et l'application PHP qui y est exécutée est affichée.

La machine n°2 est une nouvelle application exécutant Django, elle utilise un backend entièrement différent (même l'authentification), elle est hébergée sur une machine distincte. Dans notre intranet, nous y accédons par un simple nom d'hôte qui renvoie à l'adresse IP interne 192.168.0.101.

J'ai essayé de jouer avec ProxyPass pour le configurer de sorte que, par exemple, un passage vers /new l'envoie à la nouvelle application :

ProxyPass /nouveau http://192.168.0.101/

Cela fonctionne en quelque sorte, la requête est envoyée à l'autre application, mais cela ne fonctionne pas car mon application Django veut rediriger vers /auth/login/, qu'elle ne reconnaît pas immédiatement. Si je modifie moi-même l'url pour qu'elle soit foo.net/new/auth/login, j'obtiens ma page de connexion, mais comme vous pouvez le deviner, faire cela tout en naviguant n'est pas pratique.

Alors comment faire pour que ProxyPass fonctionne comme je le souhaite ? Dois-je faire quelque chose avec Apache pour qu'il écrive toujours /new avant les url de l'autre application, ou est-ce quelque chose que je dois modifier dans mon application Django ?

Tout conseil et toute indication seraient également très appréciés. Merci pour votre temps

11voto

Stephen L Points 293

Vous devez modifier votre application django pour qu'elle s'attende à être dans /new/auth/login au lieu de /auth/login. En général, vos passes de proxy devraient ressembler à ceci :

ProxyPass /path http://192.168.0.101/path
ProxyPassReverse /path http://192.168.0.101/path

Si votre application Django s'attend à se trouver sur /new/, cela devrait résoudre vos problèmes.

3voto

Lionel Points 231

Utilisez un VirtualHost. Par exemple, définissez le nom A de votre serveur (par ex. sub.external.com ) à l'IP de votre serveur (ex. 123.456.678 )

Pour des raisons de sécurité, vous devez faire suivre explicitement HTTP_HOST si vous utilisez ProxyPass dans l'application settings.py par Ticket #6880 :

USE_X_FORWARDED_HOST = True

Ajoutez ensuite ce qui suit à Apache /etc/httpd/httpd.conf :

# Virtual hosts
Include /etc/httpd/extra/httpd-vhosts.conf

Ajoutez votre VirtualHost à /etc/httpd/extra/httpd-vhosts.conf :

NameVirtualHosts *:80

<VirtualHost *:80>
  ServerName sub.external.com
  ProxyPass / http://127.0.0.1:8000/
</VirtualHost>

Maintenant, vous pourrez accéder à votre site à partir de http://sub.external.com sans avoir à se soucier des "chemins".

1voto

Merci pour vos réponses, je réponds à ma propre question car elle nécessite quelques révisions après avoir joué avec cela.

Tout d'abord, l'application n°2 s'enfuit http://192.168.0.101 il ne s'écoule pas http://192.168.0.101/path pour que ProxyPass ne fonctionne pas vraiment

Après avoir discuté avec des gars de #apache sur irc, j'ai découvert que je devais faire quelque chose comme ceci :

RewriteCond %{HTTP_HOST} ^app2.myremotedns.com*

RewriteRule .* http://192.168.0.101/ [P]

Cela permet d'envoyer une règle de réécriture pour toutes les demandes à app2.myremotedns.com qui seront envoyées à l'ip interne via un proxy.

Cela fonctionne un peu mais présente trois problèmes :

  • Avec la connexion requise sur toutes les pages, si j'accède à quelque chose de distant sur l'application 2, il est redirigé vers /auth/login Cependant, en raison de la configuration actuelle de Rewrite, j'obtiens une boucle de redirection avant que Firefox n'arrête d'essayer le chemin. Je suppose que cela pourrait avoir quelque chose à voir avec les méthodes de redirection de Django, mais je ne suis pas tout à fait sûr.

  • Si je désactive la connexion, les pages fonctionnent plus ou moins, mais pas complètement. Je semble être en mesure de récupérer la page d'index de l'application n° 2, mais rien d'autre.

  • Les médias statiques sont tous cassés, mais il s'agit probablement d'une solution simple Je ne m'inquiète pas pour l'instant.

Donc, j'ai un problème plus complexe que je ne l'imaginais... :)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X