PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ApacheHttpd Proxy/ReverseProxy und Rewrite Rules?



jimmy0815
24.07.13, 20:31
Hallo Leute,

ich habe hier folgendes Szenario das mir Kopfzerbrechen bereitet:

Server X auf dem ein apache läuft und dann noch diverse andere Webanwendungen jeweils unter einem eigenen Tomcat/Jetty (unterschiedliche Ports).

Aus dem lokalen Netz sollen die alle einzeln erreichbar sein, ist ja auch der Fall.
Aus dem Internet gibt es eine Portfreigabe auf den Port 80 des apache. Nun will ich auch von außen auf die anderen Services zugreifen und wollte dazu den Proxy vom apache benutzen, in etwa so:



ProxyPass /service1 https://localhost:8180/
ProxyPassReverse /service1 https://localhost:8180/

ProxyPass /service2 https://localhost:8181/
ProxyPassReverse /service2 https://localhost:8181/


Dies funktioniert relativ schlecht. Ich bekomme zwar etwas angezeigt, allerdings ist jetzt das Problem, dass nicht alles geladen werden kann. Dies liegt daran, dass in den Webanwendungen relative Pfade benutzt werden die sich auf das Wurzelverzeichnis beziehen, z.B.

<a href="/foo/bar/foo.jspa"
Das ist ja auch relativ richtig, wenn man den Service direkt aufruft, über den Proxy gibt das aber nur Probleme.
Jetzt habe ich gelesen, dass man zusätzlich mit einer Rewrite Rule arbeiten sollte, die das [P]-Tag beinhaltet. Allerdings blicke ich bei nicht ganz durch, was es mit den Regex usw auf sich hat.

1. Ist das denn überhaupt machbar, so wie ich das will?
2. Falls ja, mag mir jemand erklären wie so eine Rewrite-Regel aussehen müsste?

grüße
jimmy

nopes
25.07.13, 11:29
Hallo,

halte dich an diese Anleitung - http://plone.org/documentation/kb/plone-apache, ist zwar für zope, aber von der Sache hier identisch.
Wobei für dich vor allem Schritt 3 entscheidend ist.

jimmy0815
25.07.13, 22:40
Hi,

danke für deinen Link!
Ich habe mir das mal angeschaut und probiert. Allerdings nur mit geringem Erfolg :/

Folgendes habe ich hinbekommen:


<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^/s/(.*) \
https://server/service1/s/$1 [NE,R]
RewriteRule ^/plugins/(.*) \
https://server/service1/plugins/$1 [NE,R]
RewriteRule ^/rest/(.*) \
https://server/service1/rest/$1 [NE,R]
RewriteRule ^/secure/(.*) \
https://server/service1/secure/$1 [NE,R]
RewriteRule ^/browse/(.*) \
https://server/service1/browse/$1 [NE,R]
RewriteRule ^/images/(.*) \
https://server/service1/images/$1 [NE,R]
RewriteRule ^/service1/(.*) \
https://server/service1/issues/$1 [NE,R]
RewriteRule ^/service1(.*) \
https://server:8180$1 [L,P]

RewriteLog "/var/log/httpd/rewrite_log"
RewriteLogLevel 2
</IfModule>


Funktioniert in soweit, dass der Service1 teilweise voll funktionsfähig ist (über Apache). Probleme gibt es aber dann, wenn im Service dann ein Verweis direkt auf das Document-Root erfolgt, dann klappts nicht.
Desweiteren glaube ich nicht, dass das so sein sollte, da es ja dann Probleme geben würde, wenn ein anderer Service, der ebenfalls als Unterverzeichnis auf dem Apache erreichbar sein soll gleiche Unterverzeichnisse hat.

Ich komme da nicht so recht weiter :(

nopes
26.07.13, 08:23
Hast du einen eigene vhost dafür? Wenn ja sollte es eigentlich keine Probleme bereiten.

Offensichtlich hast da ja welche, also mal in die access-log schauen, wie kommt den so ein "Verweis direkt auf das Document-Root" an? Schau dir das auch mal im Browser an, mit zB kannst du dir mit Firebug schnell und einfach eine Übersicht über die Requests holen und prüfen, ob es Probleme mit deinen Rewrites gibt. Und vorallem poste die entsprechende Request URL, bei denen es nicht läuft.

Wobei es eine gute Idee ist, dass möglichst der komplette vhost umgeschrieben bzw. gelenkt wird, so würde schon die erste vhost aus dem Tutorial ausreichen. Aber es genügt ja offensichtlich nicht deinen Anforderungen, denn du verteilst ja auf diverse Server und da es ist leider normal, dass es ein ziemliches gefrickel ist und ist natürlich auch nicht der Robustheit zuträglich. Ggf. hilft dir auch noch das Modul mod_substitute (http://httpd.apache.org/docs/2.2/mod/mod_substitute.html) weiter, dafür muss der Inhalt aber auch vom Apache kommen, was glaube ich bei dir nicht der Fall ist.

jimmy0815
26.07.13, 09:42
Also ich glaube das große Problem, ist, dass alles in einem vHost laufen soll, nur halt mit getrennten Unterverzeichnissen.

Eine Anfrage bei der es nicht funktioniert ist z.B.

https://server/source?validate

Ließe sich ja eigentlich auch umschreiben, mein Problem ist aber, dass ich denke das ich da falsch ran gehe. Das klappt ja vielleicht beim ersten Service, vielleicht auch beim zweiten, aber sobald zwei verschiedene externe Services mit ähnlichen Verzeichnissstrukturen über einen vHost als Unterverzeichnisse laufen wird es gewaltig krachen.

Gruß

nopes
26.07.13, 12:50
ja das ist nicht schön. Was mir schon bei so etwas geholfen hat, beim Ausliefern habe ich mit mod_substitute entsprechend "idents" angebaut, die dann wiederum leicht durch mod_rewrite erkannt werden konnten.

Es ist und bleibt aber Frickelei, wenn es eben geht, spendiere jeden Service einen eigenen vhost oder wenigstens alias, dass würde es wesentlich vereinfachen.