Aidez-moi à comprendre comment utiliser ProxyPass

11

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

Salut,

Si vous lisez ceci, vous connaissez probablement 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 différentes machines, et lorsque vous accédez à distance avec cette configuration, les choses tournent mal.

Donc, ma configuration est très simple, j'ai:

L'accès à distance est activé sur la machine n ° 1, j'y accède via un nom d'hôte et elle crache l'application PHP qui s'exécute dessus.

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

J'ai essayé de jouer avec ProxyPass pour le configurer, par exemple, une passe vers / new l'enverrait à la nouvelle application:

ProxyPass / nouveau http://192.168.0.101/

Ce genre de travail, il reçoit la demande de l'autre application, mais il casse parce que mon application Django veut rediriger vers / auth / login /, qu'elle ne reconnaît pas instantanément. 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, cela pendant la navigation n'est pas pratique.

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

Tous les conseils et astuces seraient également grandement appréciés. Merci pour votre temps


la source

Réponses:

11

Vous devez modifier votre application django pour vous attendre à être dans / new / auth / login au lieu de / auth / login. Généralement, vos passes de proxy devraient ressembler à ceci:

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

Cela combiné avec votre application Django qui devrait être dans / new / devrait résoudre vos problèmes.

f4nt
la source
2

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

Pour des raisons de sécurité, vous devez transférer explicitement HTTP_HOST si vous utilisez ProxyPass dans 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 depuis http://sub.external.com sans avoir à vous soucier des "chemins"

Lionel
la source
1

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

Tout d'abord, l'application # 2 s'exécute http://192.168.0.101 .. elle ne s'exécute pas http://192.168.0.101/path de sorte que ProxyPass ne fonctionnera pas tout à fait

Donc, après avoir parlé avec des gars #apache d'irc, j'ai trouvé que je devais faire quelque chose comme ça:

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

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

Ce que cela fait, c'est d'envoyer une règle de réécriture pour toutes les demandes à app2.myremotedns.com à envoyer à l'IP interne via un proxy.

Cela fonctionne quelque peu mais a trois problèmes:

  • Avec une connexion requise sur toutes les pages, si j'accède à quelque chose à distance sur app2, il redirige vers / auth / login .. cependant, en raison de la configuration de réécriture actuelle, j'obtiens une boucle de redirection avant que Firefox arrête simplement 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 en quelque sorte, mais pas complètement. Je semble pouvoir récupérer la page d'index de l'App # 2 mais rien d'autre vraiment

  • Les supports statiques sont tous cassés, mais c'est probablement une solution simple .. ne vous inquiétez pas pour le moment.

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


la source
L'utilisation d'une configuration django différente de la configuration par défaut cause beaucoup de problèmes. Récemment, j'ai résolu un autre problème avec Django et ProxyPass sur mon blog: fromzerotocodehero.blogspot.com/2011/01/…
1
Avez-vous trouvé une solution à ce sujet? J'ai exactement les mêmes problèmes, en particulier avec la perte de styles de médias, etc.
membersound