Apache2 als Reverse Proxy mit websocket für FHEM

Begonnen von klausw, 17 Februar 2017, 10:46:30

Vorheriges Thema - Nächstes Thema

klausw

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 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?

RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

h3llsp4wn


klausw

#2
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?
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

klausw

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
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

Brause

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

klausw

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?
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

Brause


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"

klausw

#7
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

RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

Brause

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.

drhirn

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

klausw

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>
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

drhirn

Funktioniert bei mir nur, wenn ich die RewriteCond "!=websocket" weglasse. Aber deren Sinn ist mir ja sowieso nicht ganz klar.

klausw

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.
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

Brause

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://


Mumpitz

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?