FHEM Forum

FHEM - Hardware => Server - Linux => Thema gestartet von: klausw am 17 Februar 2017, 10:46:30

Titel: Apache2 als Reverse Proxy mit websocket für FHEM
Beitrag von: klausw am 17 Februar 2017, 10:46:30
Hallo zusammen,

ich nutze den Apache als Reverse Proxy für 2 FHEM Instanzen und FTUI (PHP).
Als Basis habe ich die Konfiguration aus dem Wiki (https://wiki.fhem.de/wiki/Apache_Authentication_Proxy) verwendet.
Jetzt würde ich gern websockets nutzen.

Dazu habe ich noch die Zeilen
  ProxyPass ws://localhost:8082/fhem
  ProxyPassReverse ws://localhost:8082/fhem

ergänzt.

Nur leider klappt das so nicht.

websockets über den Apache Proxy funktioniert grundsätzlich. Ich nutze es bereits für NodeRed.

Hat es hier schon einer hinbekommen?

Titel: Antw:Apache2 als Reverse Proxy mit websocket für FHEM
Beitrag von: h3llsp4wn am 17 Februar 2017, 10:57:56
Hi,

schau mal hier - ggf. sind es die rewrite rules, die Dir fehlen:

https://forum.fhem.de/index.php/topic,66879.60.html (https://forum.fhem.de/index.php/topic,66879.60.html)
Titel: Antw:Apache2 als Reverse Proxy mit websocket für FHEM
Beitrag von: klausw am 17 Februar 2017, 16:19:56
Danke für den Tip,

habe die Rules eingebaut

/etc/apache2/sites-available/fhem.conf :
<Location /fhem>

  RewriteEngine On
  RewriteCond %{HTTP:Upgrade} =websocket [NC]
  RewriteRule /fhem/(.*)           ws://localhost:8082/fhem/$1 [P,L]
  RewriteCond %{HTTP:Upgrade} !=websocket [NC]
  RewriteRule /fhem/(.*)           http://localhost:8082/fhem/$1 [P,L]

  # Websockets
  ProxyPass ws://localhost:8082/fhem
  ProxyPassReverse ws://localhost:8082/fhem

  # ProxyPass/ProxyPassReverse leitet HTTP requests auf eine andere URL um
  ProxyPass http://localhost:8082/fhem
  ProxyPassReverse http://localhost:8082/fhem

  # ProxyHTMLURLMap passt Links im HTML/JavaScript Source an
  ProxyHTMLURLMap /        /fhem/
  ProxyHTMLURLMap /fhem/     /fhem/
  AuthType Basic
  AuthName "Password Required"
  AuthUserFile /etc/fhem-htpasswd
  Require user klaus
  Order deny,allow
  Allow from all
</Location>


Funktioniert leider nicht wie erhofft.

Die Firefox Konsole zeigt folgendes:

16:16:50.482 ERRMSG:<  fhemweb.js:363:5
16:16:50.583 Inform-channel opened (websocket) with filter   fhemweb.js:363:5
GET
https://mein.dynvpn.de:8443/fhem/ [HTTP/1.1 407 Proxy Authorization Required 4ms]
GET
https://mein.dynvpn.de:8443/fhem/ [HTTP/1.1 200 Connection Established 154ms]
Firefox kann keine Verbindung zu dem Server unter wss://mein.dynvpn.de:8443/fhem/?XHR=1&inform=type=status;filter=;since=1487344583;fmt=JSON&fw_id=884&timestamp=1487344610579 aufbauen.  fhemweb.js:897:18
16:16:50.730 ERRMSG:Connection lost, trying a reconnect every 5 seconds.<


Ich greife über TLS auf den Apache zu. Der Port wird vom Router auf die 8443 umgemapped. Das Pi selbst ist im lokalen Netz über Port 443 erreichbar.
Das TLS läuft über die default-ssl.conf.
Muss wss nochmal speziell behandelt werden?
Titel: Antw:Apache2 als Reverse Proxy mit websocket für FHEM
Beitrag von: klausw am 17 Februar 2017, 21:13:27
So funktioniert es:

<Location /fhem>

  RewriteEngine On
  RewriteCond %{HTTP:Upgrade} =websocket [NC]
  RewriteRule /fhem(.*)           ws://localhost:8082/fhem$1 [P,L]
  RewriteCond %{HTTP:Upgrade} !=websocket [NC]
  RewriteRule /fhem(.*)           http://localhost:8082/fhem$1 [P,L]

  # ProxyPass/ProxyPassReverse leitet HTTP requests auf eine andere URL um
  ProxyPass http://localhost:8082/fhem
  ProxyPassReverse http://localhost:8082/fhem

  # ProxyHTMLURLMap passt Links im HTML/JavaScript Source an
  ProxyHTMLURLMap /        /fhem/
  ProxyHTMLURLMap /fhem/     /fhem/
  AuthType Basic
  AuthName "Password Required"
  AuthUserFile /etc/fhem-htpasswd
  Require user klaus
  Order deny,allow
  Allow from all
</Location>


Die "/" hinter FHEM waren zuviel
Titel: Antw:Apache2 als Reverse Proxy mit websocket für FHEM
Beitrag von: Brause am 18 Februar 2017, 14:07:25
Darauf muss man aber auch erstmal kommen.
Ich habe mir hier auch schon den Wolf nach einer Lösung gesucht,
auch mit dieser Rule.

Was eine Stich so alles aus macht.
Nach dem ich dann nun auch mein FHEMWEB-Device nach "WEB" umbenannt habe, klappt's auch ohne Fehlermeldungen in der Konsole.

Daumen hoch.
Danke

Gruss Brause
Titel: Antw:Apache2 als Reverse Proxy mit websocket für FHEM
Beitrag von: klausw am 18 Februar 2017, 19:26:56
Zitat von: Brause am 18 Februar 2017, 14:07:25
Nach dem ich dann nun auch mein FHEMWEB-Device nach "WEB" umbenannt habe, klappt's auch ohne Fehlermeldungen in der Konsole.

welche Fehlermeldungen meinst du?
Titel: Antw:Apache2 als Reverse Proxy mit websocket für FHEM
Beitrag von: Brause am 18 Februar 2017, 21:58:34

Die Fehlermeldung ist diese:

https://forum.fhem.de/index.php/topic,66879.msg587505.html#msg587505

wenn es im FHEMWEB ein Device gibt das "WEB" heisst  und ein Attr "longpoll" hat das auf "websocket" steht, funktioniert der ganze Spass ohne Meldung in der Console.

Bei mir hiessen die alle WEB_xxx.
Naja jetzt gibt es wieder ein "WEB"
Titel: Antw:Apache2 als Reverse Proxy mit websocket für FHEM
Beitrag von: klausw am 18 Februar 2017, 23:22:47
Ah ok, die Meldung kam bei mir nicht. Allerdings funktioniert die Websocket Verbindung im Zusammenhang mit FTUI bei mir nicht ordentlich.

Es kommt:
Longpoll (Websocket) started

Nach einer Weile 4 Meldungen:
FHEM connected
Disconnected from FHEM
Retry to connect in 10s
Foll refresh done in 0.8s for 244 parameter(s)


Readings werden auch nicht sofort aktualisiert. Das dauert ewig.

Läuft deine FTUI über HTTPSRV oder hast du es anderweitig gelöst?

EDIT:

Habe die Ursache gefunden (https://forum.fhem.de/index.php/topic,66879.msg588295.html#msg588295)

Titel: Antw:Apache2 als Reverse Proxy mit websocket für FHEM
Beitrag von: Brause am 19 Februar 2017, 07:27:50
Ja die Meldung hatte ich als der Proxy noch nicht richtig konfiguriert war bzw das "WEB" nicht vorhanden war bzw attr longpoll nicht auf websocket stand.

Das meta "fhemweb_url" habe ich bei mir nicht gesetzt, da ich im Endeffekt 4 Wege habe über die ich zugreifen könnte.

und bis jetzt hat FTUI immer die richtige URL von alleine gefunden.
Titel: Antw:Apache2 als Reverse Proxy mit websocket für FHEM
Beitrag von: drhirn am 22 Februar 2017, 09:19:22
Kurze Frage: Wie müsste das aussehen, wenn FHEM nicht auf dem selben Server, wie Apache installiert ist? ProxyPass ist klar, aber die Rewrite-Rules?

Danke!
Stefan
Titel: Antw:Apache2 als Reverse Proxy mit websocket für FHEM
Beitrag von: klausw am 22 Februar 2017, 10:53:21
Zitat von: drhirn am 22 Februar 2017, 09:19:22
Kurze Frage: Wie müsste das aussehen, wenn FHEM nicht auf dem selben Server, wie Apache installiert ist? ProxyPass ist klar, aber die Rewrite-Rules?

Bei denen sollte es das gleiche sein (muss ich selbst noch umbauen)

localhost:8082 -> <ip>:<port>
Titel: Antw:Apache2 als Reverse Proxy mit websocket für FHEM
Beitrag von: drhirn am 22 Februar 2017, 16:04:41
Funktioniert bei mir nur, wenn ich die RewriteCond "!=websocket" weglasse. Aber deren Sinn ist mir ja sowieso nicht ganz klar.
Titel: Antw:Apache2 als Reverse Proxy mit websocket für FHEM
Beitrag von: klausw am 23 Februar 2017, 23:33:51
Zitat von: drhirn am 22 Februar 2017, 16:04:41
Funktioniert bei mir nur, wenn ich die RewriteCond "!=websocket" weglasse. Aber deren Sinn ist mir ja sowieso nicht ganz klar.

So richtig durchgestiegen bin ich bei dem ganzen proxy Kram sowieso nicht. Vermutlich wird es benötigt um von Websocket wieder auf die Ajax Variante zu gehen wenn mit den Websockets irgendwas nicht funktioniert.
Es kann aber genauso gut überflüssig sein.
Titel: Antw:Apache2 als Reverse Proxy mit websocket für FHEM
Beitrag von: Brause am 24 Februar 2017, 06:40:25
das ist praktisch eine Anfrage-Weiche.

Ist die Anfrage an /fhem ein websocket (=) dann schicke es mit Präfix ws://
ist es irgendetwas anderes (also kein websocket !=) dann schicke es mit Präfix http://

Titel: Antw:Apache2 als Reverse Proxy mit websocket für FHEM
Beitrag von: Mumpitz am 24 Februar 2017, 06:46:13
Hallo zusammen

Ich weiss nicht ob ich mit meiner Frage den Thread kappere, aber ihr als Spezialisten könnt mir allenfalls weiterhelfen:

Wisst ihr zufällig wie nginx für die Websockets anfragen unkonfiguriert werden muss?
Titel: Antw:Apache2 als Reverse Proxy mit websocket für FHEM
Beitrag von: Brause am 24 Februar 2017, 07:05:43
also ich habe von nginx keine Ahnung, aber ein kurze suche bei google (nginx redirect websocket)  führte mich da hin:

https://www.nginx.com/blog/websocket-nginx/

also scheinbar  via node.js und dazu findest du hier auch was im Forum
Titel: Antw:Apache2 als Reverse Proxy mit websocket für FHEM
Beitrag von: h3llsp4wn am 26 Februar 2017, 16:03:23
@mumpiz: Habe meine ngnix (kein Anspruch auf Ideallösung) in diesem Unterforum gelistet. Kannst ja mal schauen - ohne Mode.js
Titel: Antw:Apache2 als Reverse Proxy mit websocket für FHEM
Beitrag von: phil82 am 02 April 2017, 14:18:09
Hallo zusammen,

nach langer langer Suche und vielen Versuchen läuft jetzt auch mein Reverse Proxy mit Websocket unter Apache2.
Ich will das Thema hier nicht wieder aufwärmen, aber vielleicht hilft meine Lösung dem ein oder anderen.

Ich musste bei mir das Apache-Modul proxy_wstunnel aktiviert wird. Ohne das Modul startet zwar der Apache. Die websocket Aufrufe funktionieren aber nicht.
a2enmod proxy_wstunnel
service apache2 restart



Für "Tablet-UI" mit Websocket musste ich in der Header-Konfiguration vom Tablet-UI das WebDevice von FHEM definieren:
<meta name='web_device' content='guiWeb'>
Der Standardwert ist WEB. Bei Longpoll mit AJAX war das nie ein Problem, bei WebSocket schon.


Die Site-Config sieht bei mir genauso aus wie von klausw geschrieben:

        <Location /fhem>
                #Für Logpoll = Websocket die Aufrufe umleiten
                RewriteEngine On
                RewriteCond %{HTTP:Upgrade} =websocket [NC]
                RewriteRule /fhem(.*)           ws://localhost:8083/fhem$1 [P,L]
                RewriteCond %{HTTP:Upgrade} !=websocket [NC]
                RewriteRule /fhem(.*)           http://localhost:8083/fhem$1 [P,L]

                # ProxyPass/ProxyPassReverse leitet HTTP requests auf eine andere URL um
                ProxyPass http://localhost:8083/fhem
                ProxyPassReverse http://localhost:8083/fhem
                ProxyHTMLEnable On

                # ProxyHTMLURLMap passt Links im HTML/JavaScript Source an
                ProxyHTMLURLMap /        /fhem/
                ProxyHTMLURLMap /fhem/     /fhem/
              ......
        </Location>

Wichtig ist auch hier, dass die RewriteRule nicht "/fhem/" heißen, sondern nur "/fhem".
FHEM nutzt als WebSocket URL "https://fhemserver:xxxx/fhem?XHR=1&inform=type..." und da sind kleine "/" mehr.



Ich hab zwischenzeitlich meine gesamte Apache-Konfiguration zerschossen, da ich auf den folgenden Hinweis im Wiki "reingefallen" bin:
ln -s /etc/apache2/mods-available/proxy_html.conf /etc/apache2/mods-enabled/proxy_html.conf
Bei mir darf ich die Verlinkung nicht durchführen.
Mit der proxy_html.conf funktioniert der gesamte Reverse Proxy nicht mehr. So ganz verstanden hab ich das aber nicht.


Vielleicht helfen die Hinweise dem ein oder anderen


Titel: Antw:Apache2 als Reverse Proxy mit websocket für FHEM
Beitrag von: Wernieman am 03 April 2017, 11:20:47
Eigentlich (laut Doku) muß man mod_proxy aktivieren, da proxy_wstunnel darauf anbaut ...
https://httpd.apache.org/docs/2.4/mod/mod_proxy_wstunnel.html (https://httpd.apache.org/docs/2.4/mod/mod_proxy_wstunnel.html)

Aber wenn es funktioniert ....