Discussion:
Problem beim Einrichten eines Reverse Proxy unter Apache
(zu alt für eine Antwort)
Thilo Engelbracht
2017-01-18 21:10:01 UTC
Permalink
Liebe Liste,

vor einigen Tagen bin ich auf den Monitoring-Dienst "uptimerobot.com"
gestossen. Mit diesem Dienst kann man seine(n) Server überwachen lassen,
ob bestimmte Dienste noch verfügbar sind oder nicht.
Bei dem Dienst ist es auch möglich, eine öffentliche Statusseite
einzurichten. Die URL dieser Seite lautet "stats.uptimerobot.com/$ID",
wobei die ID von dem Dienst vorgegeben wird.

In meinem Fall lautet die komplette URL
"stats.uptimerobot.com/Qny1AuoR1".

Da dies schlecht zu merken ist, habe ich auf meinem RootServer
(Debian 8.7) unter Apache einen virtuellen Hosts erstellt.
Mein Ziel: Wenn ein User in seinem Client die URL "stats.engelbracht.de"
eingibt, dann soll im Browser der Inhalt der Webseite
"stats.uptimerobot.com/Qny1AuoR1" angezeigt werden.

Ich möchte KEINE einfache Weiterleitung definieren, sondern einen
Reverse Proxy einzurichten.

Meine Apache-Konfiguration sieht so aus:

<VirtualHost 11.22.33.44:80>

ServerName stats.engelbracht.de
Redirect permanent / https://stats.engelbracht.de/

</VirtualHost>

<IfModule mod_ssl.c>
<VirtualHost 11.22.33.44:443>

DocumentRoot /srv/www/stats.engelbracht.de
ServerName stats.engelbracht.de
ServerAdmin ***@engelbracht.de

ServerSignature Off

SSLEngine On
SSLCertificateFile /path/to/ssl.pem
SSLCertificateKeyFile /path/to/key.pem

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/stats.engelbracht.de.log combined

ProxyPass / http://stats.uptimerobot.com/
ProxyPassReverse / http://stats.uptimerobot.com/
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/?$
RewriteRule ^(.*)$ http://stats.engelbracht.de/Qny1AuoR1 [L]

</VirtualHost>
</IfModule>

Grundsätzlich funktioniert das auch - aber es gibt einen
Schönheitsfehler: Wenn jemand im Browser "stats.engelbracht.de" eingibt,
dann erscheint zwar die Statusseite. So weit, so gut. Allerdings wird in
der Adresszeile "stats.engelbracht.de/Qny1AuoR1" angezeigt...

Kann mir jemand sagen, wie ich die Konfiguration verändern muss, damit
in der Adresszeile nur "stats.engelbracht.de" angezeigt wird?

Vielen Dank im Voraus!


Liebe Grüße

Thilo
Sven Hartge
2017-01-18 22:00:01 UTC
Permalink
Post by Thilo Engelbracht
ProxyPass / http://stats.uptimerobot.com/
ProxyPassReverse / http://stats.uptimerobot.com/
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/?$
RewriteRule ^(.*)$ http://stats.engelbracht.de/Qny1AuoR1 [L]
Grundsätzlich funktioniert das auch - aber es gibt einen
Schönheitsfehler: Wenn jemand im Browser "stats.engelbracht.de" eingibt,
dann erscheint zwar die Statusseite. So weit, so gut. Allerdings wird in
der Adresszeile "stats.engelbracht.de/Qny1AuoR1" angezeigt...
Kann mir jemand sagen, wie ich die Konfiguration verändern muss, damit
in der Adresszeile nur "stats.engelbracht.de" angezeigt wird?
ProxyPass / http://stats.uptimerobot.com/Qny1AuoR1
ProxyPassReverse / http://stats.uptimerobot.com/Qny1AuoR1

RewriteRule etc. fallen dann weg.


--
Sigmentation fault. Core dumped.
Thilo Engelbracht
2017-01-18 22:20:01 UTC
Permalink
Post by Sven Hartge
Post by Thilo Engelbracht
ProxyPass / http://stats.uptimerobot.com/
ProxyPassReverse / http://stats.uptimerobot.com/
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/?$
RewriteRule ^(.*)$ http://stats.engelbracht.de/Qny1AuoR1 [L]
Grundsätzlich funktioniert das auch - aber es gibt einen
Schönheitsfehler: Wenn jemand im Browser "stats.engelbracht.de" eingibt,
dann erscheint zwar die Statusseite. So weit, so gut. Allerdings wird in
der Adresszeile "stats.engelbracht.de/Qny1AuoR1" angezeigt...
Kann mir jemand sagen, wie ich die Konfiguration verändern muss, damit
in der Adresszeile nur "stats.engelbracht.de" angezeigt wird?
ProxyPass / http://stats.uptimerobot.com/Qny1AuoR1
ProxyPassReverse / http://stats.uptimerobot.com/Qny1AuoR1
RewriteRule etc. fallen dann weg.
Hallo Sven,

das war zuerst auch mein Ansatz - aber das funktioniert nicht:
Wenn ich Deinen Vorschlag übernehme und einen reload von Apache
durchführe, dann wird nach der Eingabe von "stats.engelbracht.de" die
Seite nicht mehr korrekt angezeigt...
Kann es sein, dass das irgendwie mit JavaScript zu tun hat?

Hast Du eine Idee, wie man den vHost konfigurieren muss?

Vielen Dank im Voraus.
Post by Sven Hartge

Gruß,

Thilo
Sven Hartge
2017-01-18 22:30:03 UTC
Permalink
Post by Thilo Engelbracht
Post by Sven Hartge
Post by Thilo Engelbracht
ProxyPass / http://stats.uptimerobot.com/
ProxyPassReverse / http://stats.uptimerobot.com/
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/?$
RewriteRule ^(.*)$ http://stats.engelbracht.de/Qny1AuoR1 [L]
Grundsätzlich funktioniert das auch - aber es gibt einen
Schönheitsfehler: Wenn jemand im Browser "stats.engelbracht.de" eingibt,
dann erscheint zwar die Statusseite. So weit, so gut. Allerdings wird in
der Adresszeile "stats.engelbracht.de/Qny1AuoR1" angezeigt...
Kann mir jemand sagen, wie ich die Konfiguration verändern muss, damit
in der Adresszeile nur "stats.engelbracht.de" angezeigt wird?
ProxyPass / http://stats.uptimerobot.com/Qny1AuoR1
ProxyPassReverse / http://stats.uptimerobot.com/Qny1AuoR1
RewriteRule etc. fallen dann weg.
Wenn ich Deinen Vorschlag übernehme und einen reload von Apache
durchführe, dann wird nach der Eingabe von "stats.engelbracht.de" die
Seite nicht mehr korrekt angezeigt...
Kann es sein, dass das irgendwie mit JavaScript zu tun hat?
Wahrscheinlich. mod_proxy fasst nichts innerhalb der Seite an und wenn
man den Pfad-Teil verändert (in diesem Fall von "/Qny1AuoR1" auf "/"),
dann geht das zumeinst schief. Es gibt dann noch mod_proxy_html, aber
auch dieses Modul ist sehr sehr eingeschränkt in seiner Zielsetzung und
funktioniert nicht für durch JavaScript clientseitig erzeugte dynamische
Webseiten.

Wenn du zu proxiende Webseite (hier
http://stats.uptimerobot.com/Qny1AuoR1) nicht mitspielt (was bei
JavaScript eigentlich immer der Fall ist), dann hast du keine Chance das
gewüschte umzusetzen und du wirst damit Leben müssen, den Pfad
"/Qny1AuoR1" auch in deiner veränderten URL zu sehen.


--
Sigmentation fault. Core dumped.
Thilo Engelbracht
2017-01-19 08:10:01 UTC
Permalink
Post by Sven Hartge
Post by Thilo Engelbracht
Post by Sven Hartge
Post by Thilo Engelbracht
ProxyPass / http://stats.uptimerobot.com/
ProxyPassReverse / http://stats.uptimerobot.com/
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/?$
RewriteRule ^(.*)$ http://stats.engelbracht.de/Qny1AuoR1 [L]
Grundsätzlich funktioniert das auch - aber es gibt einen
Schönheitsfehler: Wenn jemand im Browser "stats.engelbracht.de" eingibt,
dann erscheint zwar die Statusseite. So weit, so gut. Allerdings wird in
der Adresszeile "stats.engelbracht.de/Qny1AuoR1" angezeigt...
Kann mir jemand sagen, wie ich die Konfiguration verändern muss, damit
in der Adresszeile nur "stats.engelbracht.de" angezeigt wird?
ProxyPass / http://stats.uptimerobot.com/Qny1AuoR1
ProxyPassReverse / http://stats.uptimerobot.com/Qny1AuoR1
RewriteRule etc. fallen dann weg.
Wenn ich Deinen Vorschlag übernehme und einen reload von Apache
durchführe, dann wird nach der Eingabe von "stats.engelbracht.de" die
Seite nicht mehr korrekt angezeigt...
Kann es sein, dass das irgendwie mit JavaScript zu tun hat?
Wahrscheinlich. mod_proxy fasst nichts innerhalb der Seite an und wenn
man den Pfad-Teil verändert (in diesem Fall von "/Qny1AuoR1" auf "/"),
dann geht das zumeinst schief. Es gibt dann noch mod_proxy_html, aber
auch dieses Modul ist sehr sehr eingeschränkt in seiner Zielsetzung und
funktioniert nicht für durch JavaScript clientseitig erzeugte dynamische
Webseiten.
Wenn du zu proxiende Webseite (hier
http://stats.uptimerobot.com/Qny1AuoR1) nicht mitspielt (was bei
JavaScript eigentlich immer der Fall ist), dann hast du keine Chance das
gewüschte umzusetzen und du wirst damit Leben müssen, den Pfad
"/Qny1AuoR1" auch in deiner veränderten URL zu sehen.
Alles klar. Erstmal vielen Dank für die Info.

Durch Zufall bin ich auf folgende Webseite gestossen:

https://legacy.thomas-leister.de/uptimerobot-statusseite-mit-eigener-subdomain-und-https-nutzen/

Hier wird exakt das gleiche Thema behandelt, allerdings kommt als
Webserver nginx zum Einsatz.
Der interessante Punkt: Der Autor schreibt:

"Mit der folgenden Konfiguration kann man dann auch auf die Angabe
der ID in der URL verzichten:"

Also genau das, was ich auch gerne hätte.

Die nginx-Konfiguration sieht wie folgt aus:

server {
server_name status.trashserver.net;

listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;

ssl_certificate /etc/myssl/...;
ssl_certificate_key /etc/myssl/...;

location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-NginX-Proxy true;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass https://stats.uptimerobot.com/rk3R0IDJq/;
proxy_redirect off;
}

location ~ ^/(.+) {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-NginX-Proxy true;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass https://stats.uptimerobot.com;
proxy_redirect off;
}
}

Habe einen kurzen Test durchgeführt und die URL "status.trashserver.net"
aufgerufen: Die externe URL ist nicht sichtbar!

Natürlich möchte ich jetzt nicht den Apache deinstallieren und dafür den
nginx einsetzen.
Aber vielleicht besteht ja die Möglichkeit, die oben beschriebene
nginx-Konfiguration in die Apache-Syntax zu übersetzen... Habe ich
hierdurch eine Chance, mein Ziel doch noch zu erreichen?
(Oder ist es so, dass der nginx einen Reverse Proxy technisch anders
löst als der Apache?)
Post by Sven Hartge

Lieben Gruß,

Thilo
Sven Hartge
2017-01-19 08:20:02 UTC
Permalink
Post by Thilo Engelbracht
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-NginX-Proxy true;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass https://stats.uptimerobot.com/rk3R0IDJq/;
proxy_redirect off;
}
location ~ ^/(.+) {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-NginX-Proxy true;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass https://stats.uptimerobot.com;
proxy_redirect off;
}
}
Habe einen kurzen Test durchgeführt und die URL "status.trashserver.net"
aufgerufen: Die externe URL ist nicht sichtbar!
Natürlich möchte ich jetzt nicht den Apache deinstallieren und dafür den
nginx einsetzen.
Aber vielleicht besteht ja die Möglichkeit, die oben beschriebene
nginx-Konfiguration in die Apache-Syntax zu übersetzen... Habe ich
hierdurch eine Chance, mein Ziel doch noch zu erreichen?
Der Trick ist, zwei <Location></Location> Sektionen zu haben, analog zu
obigem Beispiel und darin dann unterschiedliche ProxyPass-Einträge zu
haben, ebenfalls analog zu oben.

Dann funktioniert es zumindest mit der uptimerobot-Seite.


--
Sigmentation fault. Core dumped.
Thilo Engelbracht
2017-01-19 20:00:07 UTC
Permalink
Post by Sven Hartge
Post by Thilo Engelbracht
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-NginX-Proxy true;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass https://stats.uptimerobot.com/rk3R0IDJq/;
proxy_redirect off;
}
location ~ ^/(.+) {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-NginX-Proxy true;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass https://stats.uptimerobot.com;
proxy_redirect off;
}
}
Habe einen kurzen Test durchgeführt und die URL "status.trashserver.net"
aufgerufen: Die externe URL ist nicht sichtbar!
Natürlich möchte ich jetzt nicht den Apache deinstallieren und dafür den
nginx einsetzen.
Aber vielleicht besteht ja die Möglichkeit, die oben beschriebene
nginx-Konfiguration in die Apache-Syntax zu übersetzen... Habe ich
hierdurch eine Chance, mein Ziel doch noch zu erreichen?
Der Trick ist, zwei <Location></Location> Sektionen zu haben, analog zu
obigem Beispiel und darin dann unterschiedliche ProxyPass-Einträge zu
haben, ebenfalls analog zu oben.
Dann funktioniert es zumindest mit der uptimerobot-Seite.
Jetzt habe ich meine Konfiguration so geändert (die entscheidenden
Zeilen):

ProxyRequests Off

<Location />
ProxyPass https://stats.uptimerobot.com/Qny1AuoR1/
#ProxyPassReverse https://stats.uptimerobot.com/Qny1AuoR1/
</Location>

<Location ~ ^/(.+)>
ProxyPass https://stats.uptimerobot.com
#ProxyPassReverse https://stats.uptimerobot.com
</Location>

#RewriteEngine On
#RewriteCond %{REQUEST_URI} ^/?$
#RewriteRule ^(.*)$ http://stats.engelbracht.de [L]


Anschl. habe ich einen reload durchgeführt.
Vielleicht habe ich ja Tomaten auf den Augen, aber es klappt nicht.

Könntest Du Dir das bitte nochmal anschauen?

Vielen Dank im Voraus für Deine Hilfe.
Post by Sven Hartge

Liebe Grüße,

Thilo
Jochen Spieker
2017-01-19 20:10:01 UTC
Permalink
Post by Thilo Engelbracht
Vielleicht habe ich ja Tomaten auf den Augen, aber es klappt nicht.
Das lässt sich sicherlich auch detaillierter beschreiben.

Ich persönlich würde das der besseren Debugbarkeit wegen mit
RewriteRules machen (Flag 'P'). Das konnte man zumindest mit Apache 2.2
besser loggen lassen. 2.4 habe ich noch nicht so gut drauf, da lässt
sich das Logging für alles Mögliche recht fein einstellen.

J.
--
I hate myself but have no clear idea why.
[Agree] [Disagree]
<http://archive.slowlydownward.com/NODATA/data_enter2.html>
Sven Hartge
2017-01-19 10:50:02 UTC
Permalink
Post by Thilo Engelbracht
Grundsätzlich funktioniert das auch - aber es gibt einen
Schönheitsfehler: Wenn jemand im Browser "stats.engelbracht.de" eingibt,
dann erscheint zwar die Statusseite. So weit, so gut. Allerdings wird in
der Adresszeile "stats.engelbracht.de/Qny1AuoR1" angezeigt...
Andere Frage: Warum nutzt du nicht das vorhandene Feature mit der
persönlichen Status-Seite? Einfach einen CNAME-Eintrag im DNS von
stats.engelbracht.de auf "stats.uptimerobot.com." einrichten, fertig.

Funktioniert wie gewünscht, der Code wird nicht angezeigt _und_ die
Status-Seite funktioniert auch dann, wenn dein Server down ist.


--
Sigmentation fault. Core dumped.
Thilo Engelbracht
2017-01-20 16:30:02 UTC
Permalink
Post by Sven Hartge
Post by Thilo Engelbracht
Grundsätzlich funktioniert das auch - aber es gibt einen
Schönheitsfehler: Wenn jemand im Browser "stats.engelbracht.de" eingibt,
dann erscheint zwar die Statusseite. So weit, so gut. Allerdings wird in
der Adresszeile "stats.engelbracht.de/Qny1AuoR1" angezeigt...
Andere Frage: Warum nutzt du nicht das vorhandene Feature mit der
persönlichen Status-Seite? Einfach einen CNAME-Eintrag im DNS von
stats.engelbracht.de auf "stats.uptimerobot.com." einrichten, fertig.
Funktioniert wie gewünscht, der Code wird nicht angezeigt _und_ die
Status-Seite funktioniert auch dann, wenn dein Server down ist.
Hallo Sven,

ich glaube, dass ich Dich nicht verstanden habe...
Es gibt ja die Möglichkeit, in den Einstellungen vom "uptimerobot" eine
(oder mehrere) public-status-Seiten anzulegen. Das habe ich ja oben
gemacht.
Die persönliche Status-Seite (wo ich auch diverse Einstellungen
vornehmen kann) sehe ich nur, wenn ich die uptimerobot-Seite aufrufe und
mich bei dem Dienst anmelde. Dann muss ich aber jedes Mal meine
Login-Daten eingeben (E-Mail-Adresse und Kennwort).

Oder habe ich Dich falsch verstanden?
Post by Sven Hartge

Gruß,

Thilo

Loading...