Helfen Sie mir zu verstehen, wie ProxyPass verwendet wird


11

UPDATE: Ich habe eine überarbeitete Frage hinzugefügt, nachdem ich zwei Antworten unten damit herumgespielt habe.

Hallo,

Wenn Sie dies lesen, sind Sie wahrscheinlich mit Apaches mod_proxy und seiner ProxyPass-Funktion vertraut. Wie viele andere habe ich das Problem, eine Anwendung zu haben, auf die ich von außerhalb unseres internen Netzwerks zugreifen kann, aber diese Anwendung selbst greift auf andere interne Apps auf verschiedenen Computern zu, und wenn Sie mit diesem Setup in den Fernzugriff gelangen, wird es schwierig.

Also, mein Setup ist sehr einfach, ich habe:

Auf Computer Nr. 1 ist der Remotezugriff aktiviert. Ich greife über einen Hostnamen darauf zu und spucke die darauf ausgeführte PHP-Anwendung aus.

Maschine Nr. 2 ist eine neue Anwendung, auf der Django ausgeführt wird. Sie verwendet ein völlig anderes Backend (sogar Auth) und wird auf einer separaten Maschine gehostet. In unserem Intranet greifen wir über einen einfachen Hostnamen zu, der im Wesentlichen mit der internen IP 192.168.0.101 verknüpft ist.

Ich habe versucht, mit ProxyPass zu spielen, um es so einzurichten, dass beispielsweise ein Pass an / new es an die neue Anwendung sendet:

ProxyPass / new http://192.168.0.101/

Diese Art von funktioniert, es erhält die Anfrage an die andere App, aber es bricht ab, weil meine Django-App nach / auth / login / umleiten möchte, was sie sofort nicht erkennt. Wenn ich die URL selbst in foo.net/new/auth/login ändere, erhalte ich meine Anmeldeseite, aber wie Sie sich vorstellen können, ist es nicht bequem, dies während des Browsings zu tun.

Wie kann ich ProxyPass zum Laufen bringen, wie ich will? Muss ich etwas mit Apache tun, damit es immer vor der URL in der anderen App schreibt / neu ist, oder sollte ich dies in meiner Django-App ändern?

Alle Tipps und Hinweise wäre sehr dankbar. Vielen Dank für Ihre Zeit

Antworten:


11

Sie sollten Ihre Django-Anwendung so ändern, dass sie sich unter / new / auth / login anstelle von / auth / login befindet. Im Allgemeinen sollten Ihre Proxy-Pässe folgendermaßen aussehen:

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

Dies in Kombination mit Ihrer Django-App, die erwartet, bei / new / zu sein, sollte Ihre Probleme beheben.


2

Verwenden Sie einen VirtualHost. Setzen Sie beispielsweise den A-Namen Ihres Servers (z. B. sub.external.com ) auf Ihre Server-IP (z. B. 123.456.678 ).

Aus Sicherheitsgründen müssen Sie HTTP_HOST explizit weiterleiten, wenn Sie ProxyPass in settings.py gemäß Ticket Nr. 6880 verwenden :

USE_X_FORWARDED_HOST = True

Fügen Sie dann Folgendes zu Apache /etc/httpd/httpd.conf hinzu :

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

Fügen Sie Ihren VirtualHost zu /etc/httpd/extra/httpd-vhosts.conf hinzu :

NameVirtualHosts *:80

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

Jetzt können Sie über http://sub.external.com auf Ihre Website zugreifen, ohne sich um "Pfade" kümmern zu müssen.


1

Vielen Dank für Ihre Antworten. Ich beantworte meine eigene Frage, da sie nach dem Spielen einige Änderungen benötigt.

Zunächst einmal läuft App # 2 von http://192.168.0.101 . Es läuft nicht von http://192.168.0.101/path, so dass ProxyPass nicht ganz funktioniert

Nachdem ich mit einigen # apache-Leuten von irc gesprochen hatte, stellte ich fest, dass ich so etwas tun muss:

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

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

Dadurch wird eine Umschreiberegel für alle Anforderungen an app2.myremotedns.com gesendet, die über einen Proxy an die interne IP gesendet werden sollen.

Dies funktioniert etwas, hat aber drei Probleme:

  • Da auf allen Seiten eine Anmeldung erforderlich ist, wird bei App2 auf etwas remote zugegriffen, und es wird zu / auth / login umgeleitet. Aufgrund des aktuellen Rewrite-Setups wird jedoch eine Umleitungsschleife angezeigt, bevor Firefox den Pfad nicht mehr versucht. Ich denke, das könnte etwas mit Djangos Umleitungsmethoden zu tun haben, aber ich bin mir nicht ganz sicher.

  • Wenn ich die Anmeldung deaktiviere, funktionieren die Seiten, aber nicht vollständig. Ich scheine in der Lage zu sein, die Indexseite von App # 2 abzurufen, aber sonst nichts wirklich

  • Statische Medien sind alle kaputt, aber dies ist wahrscheinlich eine einfache Lösung. Machen Sie sich im Moment keine Sorgen.

Ich habe also ein komplexeres Problem als ich es mir vorgestellt habe ... :)


Die Verwendung einer anderen Django-Konfiguration als der Standardkonfiguration verursacht große Probleme. Kürzlich wurde ein weiteres Problem mit Django und ProxyPass in meinem Blog gelöst: fromzerotocodehero.blogspot.com/2011/01/…

1
Haben Sie eine Lösung dafür gefunden? Ich habe genau die gleichen Probleme, insbesondere mit dem Verlust von Medienstilen usw.
Membersound
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.