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?
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)
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×tamp=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?
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
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
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?
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"
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)
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.
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
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>
Funktioniert bei mir nur, wenn ich die RewriteCond "!=websocket" weglasse. Aber deren Sinn ist mir ja sowieso nicht ganz klar.
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.
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://
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?
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
@mumpiz: Habe meine ngnix (kein Anspruch auf Ideallösung) in diesem Unterforum gelistet. Kannst ja mal schauen - ohne Mode.js
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
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 ....