nginx reverse proxy: 2 verschiedene fhem-Instanzen erreichbar machen

Begonnen von heikoh81, 20 März 2019, 19:16:13

Vorheriges Thema - Nächstes Thema

heikoh81

Hallo zusammen,

ich möchte über nginx reverse proxy 2 verschiedene fhem-Instanzen erreichbar machen.

Instanz 1 läuft auf dem Vserver, der auch als nginx reverse proxy fungiert (logDB).
==> http://www.xyz/fhem
==> funktioniert, siehe "location /fhem {"

Instanz 2 läuft auf einem Raspi, der über OpenVPN transparent vom Vserver erreichbar ist.
==> http://www.xyz.de/benutzer/fhem
==> funktioniert nicht, siehe "location /benutzer/fhem {"
==> es funktioniert auch nicht, wenn man "rewrite ^/benutzer/fhem?/(.*)$ /fhem?$1 last;" weglässt.

"location ^~ /benutzer/ {" liefert HTML/PHP-Dateien aus (IPCam-Bilder über PHP-Skript), die auf einem Apache2 auf Instanz 2 laufen
==> funktioniert auch hinter dem nginx-Reverse-Proxy.

Es passiert folgendes:
Wenn ich https://www.xyz.de/benutzer/fhem öffne, wird korrekt fhem von Instanz 2 geladen.
Aber alle fhem-Links lauten https://www.xyz.de/fhem, so dass ich dann natürlich automatisch wieder auf Instanz 1 lande.

Was ich bräuchte:
Für alle Browser-Aufrufe, die auf www.xyz.de/benutzer/fhem reinkommen, soll mein Reverse Proxy die fhem-links umschreiben, also von
https://www.xyz.de/fhem auf https://www.xyz.de/benutzer/fhem.
Denn wenn ich z.B. manuell https://www.xyz.de/benutzer/fhem?room=Bewegungsmelder aufrufe, lande ich im korrekten fhem-room.

Es könnte an den Prioritäten liegen, mit denen nginx die locations abarbeitet, aber ich sehe nicht, wo mein Fehler ist.
Oder an den RegEx, mit denen nginx die locations bearbeitet.

Nachfolgend meine nginx-config:
server {
    listen 443;
    server_name xyz.de www.xyz.de;

    root /var/www/xyz.de/html;
    index index.php index.html;


#####HEIKO 17.04.2018 Reverse Proxy fuer FHEM auf VServer Anfang#####
    location /fhem {
proxy_set_header        Host $host;
proxy_set_header        X-Real-IP $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header        X-Forwarded-Proto $scheme;
proxy_http_version      1.1;

proxy_pass          http://localhost:8083/fhem;

proxy_read_timeout  90;
auth_basic "Restricted Content";
auth_basic_user_file /etc/nginx/.htpasswd;
    }

location ^~ /benutzer/ {
proxy_pass          http://192.168.178.230:8443/benutzer/;
proxy_buffering off;
expires off;
auth_basic "VServer Restricted Content";
auth_basic_user_file /etc/nginx/.htpasswd_benutzer;
}

location /benutzer/fhem {
proxy_pass          http://192.168.178.230:8083/;
rewrite ^/benutzer/fhem?/(.*)$ /fhem?$1 last;
proxy_buffering off;
expires off;
auth_basic "VServer Restricted Content";
auth_basic_user_file /etc/nginx/.htpasswd_benutzer;
}

    include /etc/nginx/templates/misc.tmpl;
    include /etc/nginx/templates/ssl.tmpl;
    include /etc/nginx/templates/iredadmin.tmpl;
    include /etc/nginx/templates/roundcube.tmpl;
    include /etc/nginx/templates/sogo.tmpl;
    include /etc/nginx/templates/netdata.tmpl;
    include /etc/nginx/templates/php-catchall.tmpl;

}


Wer kann mir helfen und sagen, wie die nginx-config richtig aussehen muss?
Vielen Dank,
viele Grüße,

Heiko

Wernieman

#1
Das Problem ist, das fhem selber alle Links mit /fhem zurückliefert. Eigentlich müsste man das konfigurierbar machen (weiß nur nicht, ob dieses bei FHEM konfigurierbar ist).

Ist ein grundsätzliches Problem von reverse-proxy-Lösungen (weshalb eben viele obiges konfigurierbar machen)

Du kannst aber mal probieren, am Ende vom proxy ein / zu machen:
location /benutzer/fhem/
Siehe:
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass
https://stackoverflow.com/questions/32542282/how-do-i-rewrite-urls-in-a-proxy-response-in-nginx
https://serverfault.com/questions/379675/nginx-reverse-proxy-url-rewrite
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

heikoh81

Falls jemand über Google diese Frage findet:
Ich konnte das Problem mittlerweile so lösen, dass ich in fhem eine neue FHEMWEB-Instantz nur für diesen Zweck eingerichtet habe,
und dort das
attr webname benutzername/fhem
gesetzt habe.

Viele Grüße,
Heiko