Autor Thema: Nginx als Reverse Proxy mit websocket für FHEM  (Gelesen 404 mal)

Offline h3llsp4wn

  • Full Member
  • ***
  • Beiträge: 174
Nginx als Reverse Proxy mit websocket für FHEM
« am: 16 Februar 2017, 14:37:53 »
Hallo zusammen,

u.a. da ich FHEM hinter nginx betreibe und auch die TabletUI gerne auf websocket umstellen wollte, stellt sich mir die Frage bzgl. Konfiguration von nginx. Nun bin ich da leider
kein Experte - allerdings kann ich entweder nur FHEM hinter dem Proxy erreichen oder dann nur den websocket - beides an localhost:8083 zu binden klappt nicht. Dazu müsste
ich ggf. eine anderen Entry-Point haben, d.h. eine location für fhem (/fhem) und dann ggf. eine für den websocket (/fhem_ws) o.ä. - soweit ich das verstehen. Im Apache
könnte man da wohl mir rewrite rules was basteln. Ich möchte allerdings, da ich auch noch andere Dinge laufen habe nicht wieder alles auf Apache umbauen.

Daher die Frage - nutzt jemand ggf. nginx als reverse proxy und hat hier auch die websockets ans laufen bekommen - und wenn ja, wie?


Cheers,

h3ll

Offline vbs

  • Hero Member
  • *****
  • Beiträge: 1238
Antw:Nginx als Reverse Proxy mit websocket für FHEM
« Antwort #1 am: 16 Februar 2017, 15:06:17 »
Zeig doch mal deine Konfiguration...

Offline h3llsp4wn

  • Full Member
  • ***
  • Beiträge: 174
Antw:Nginx als Reverse Proxy mit websocket für FHEM
« Antwort #2 am: 16 Februar 2017, 16:45:10 »
Stimm - guter Hinweis :)

map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}

upstream fhem {
server localhost:8083;
}

server {
        #listen   80; ## listen for ipv4; this line is default and implied
        #listen   [::]:80 default_server ipv6only=on; ## listen for ipv6

        root /var/www;
        index index.html index.htm index.php;

        # Make site accessible from http://localhost/
        server_name localhost raspberrypi.fritz.box raspberrypi;

        location /fhem {
access_log off;

                proxy_pass http://localhost:8083;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
#proxy_read_timeout 150;
                proxy_redirect off;
                proxy_buffering off;
}
...

Den timeout hatte ich mal zum Test gesetzt ... wenn ich es so laufen lasse und im FHEM longpoll auf websocket setze, dann kann ich verbinden, aber meine Aufruf direkt ohne Port über den Proxy
gibt keine Rückmeldung mehr.

Offline vbs

  • Hero Member
  • *****
  • Beiträge: 1238
Antw:Nginx als Reverse Proxy mit websocket für FHEM
« Antwort #3 am: 16 Februar 2017, 18:48:21 »
Vielleicht kannst du dir was mit der Variable $server_protocol und einem "if" basteln, aber besser wärs wie du ja auch schon gesagt hast, wenn die beiden Diensten unter getrennten locations erreichbar wären. Google bringt aber sofort "if is evil" :D https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/

Offline h3llsp4wn

  • Full Member
  • ***
  • Beiträge: 174
Antw:Nginx als Reverse Proxy mit websocket für FHEM
« Antwort #4 am: 17 Februar 2017, 09:12:15 »
Danke - service_protocol hatte ich gar nicht auf dem Schirm ... evil if habe ich auch schon gesehen  >:(, das wollte ich verhindern - trotzdem danke - ich werde es mal damit versuchen  ;).

Nachtrag - so läuft es jetzt bei mir - mit einem evil if und dem check gegen das upgrade. Der Umweg über die Variablen ist erforderlich, da nginx das setzen im if dieser Attribute nicht zulässt ... also
quasi auch schon wieder ein hack. Wer eine bessere Idee hat - her damit.

Anbei der fhem Block:

        location /fhem {
                access_log off;

                set $bla_remote_addr "";
                set $bla_proxy_add_x_forwarded_for "";
                set $bla_upgrade "";
                set $bla_connection "";
                set $bla_header "";

                if ($http_upgrade = "websocket") {
                        set $bla_remote_addr $remote_addr;
                        set $bla_proxy_add_x_forwarded_for $proxy_add_x_forwarded_for;
                        set $bla_upgrade $http_upgrade;
                        set $bla_connection "upgrade";
                        set $bla_header $host;
                }

                proxy_pass http://localhost:8083;
                proxy_set_header X-Real-IP $bla_remote_addr;
                proxy_set_header X-Forwarded-For $bla_proxy_add_x_forwarded_for;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $bla_upgrade;
                proxy_set_header Connection $bla_connection;
                proxy_set_header Host $bla_header;
                proxy_redirect off;
                proxy_buffering off;
        }

« Letzte Änderung: 17 Februar 2017, 13:18:58 von h3llsp4wn »

Offline All-Ex

  • Full Member
  • ***
  • Beiträge: 120
Antw:Nginx als Reverse Proxy mit websocket für FHEM
« Antwort #5 am: 18 Februar 2017, 00:18:03 »
Habe das bei mir nicht hinbekommen. Du lässt bei deiner if-Lösung dann den map Befehl weg oder?

Wieso bleiben denn bei allen Verbindungen ohne connection upgrade die $bla Variablen auf ""?

Offline h3llsp4wn

  • Full Member
  • ***
  • Beiträge: 174
Antw:Nginx als Reverse Proxy mit websocket für FHEM
« Antwort #6 am: 26 Februar 2017, 16:01:07 »
Hm ... weil ich diese dann nicht brauche? Bin aber kein Experte. So funktioniert es zumindest bei mir. D.h. eine richtige Antwort habe ich da nicht.

Offline dela2017

  • New Member
  • *
  • Beiträge: 43
Antw:Nginx als Reverse Proxy mit websocket für FHEM
« Antwort #7 am: 28 Februar 2017, 00:32:23 »
Hi Hellspawn,

hast du vielleicht noch irgendeine Besonderheit?
Ich möchte eigentlich wohl das gleiche wie du; ich hab deinen Teil der Konfig übernommen, aber dennoch verliert die TabletUI immer die Connection; bzw. auch auf der FHEM Hauptseite erscheint praktisch die ganze Zeit: Connection lost, trying a reconnect every 5 seconds

Gruß,
Ingo

Offline Civicoid

  • New Member
  • *
  • Beiträge: 17
Antw:Nginx als Reverse Proxy mit websocket für FHEM
« Antwort #8 am: 10 März 2017, 19:08:27 »
Danke für den Code!
Nun läuft mein FHEM wieder flüssig über NGINX.

 8)
Fhem v5.7 @ RPi2 (Jessie, Nginx, TabletUI)

 

decade-submarginal