HTTP und WebSocket auf demselben Port und in derselben Domäne hinter dem Reverse-Proxy

HTTP und WebSocket auf demselben Port und in derselben Domäne hinter dem Reverse-Proxy

Ich wollte Node-Red ausprobieren und habe es auf meinem Ubuntu-Server installiert. Auf diesem Server läuft ein Apache-Reverse-Proxy, aber ich bekomme ihn nicht richtig zum Laufen. Wenn ich einen virtuellen Host für die HTTP-Verbindung erstelle, kann ich problemlos auf meine Node-Red-Schnittstelle zugreifen, aber sie zeigt mir keine Aktivitäten wie Online-MQTT-Server oder Debug-Meldungen an. Nach einigem Googeln fand ich heraus, dass dies daran liegt, dass auch Websockets verwendet werden und diese ebenfalls durchgeleitet werden müssen.

Und hier ist das Rätsel, das ich nicht lösen konnte: Ich kann entweder HTTP oder WebSockets passieren, aber nicht gleichzeitig. Wenn ich HTTP passe, die Node-Red-Weboberfläche lade und dann die Reverse-Proxy-Einstellungen auf WS-Passthrough ändere, erhalte ich die volle Funktionalität. Ich kann die Node-Red-Seite jedoch nicht neu laden oder erneut verbinden, da HTTP-Passthrough entfernt wurde.

Wie füge ich beide in derselben Domäne und am selben Port hinzu? Oder ist das überhaupt nicht möglich? Hier ist ein Teil meiner Apache2-Konfiguration:

<VirtualHost *:80>
ServerName nr.domain.com
Redirect permanent / https://nr.domain.com/
RewriteEngine on
RewriteCond %{SERVER_NAME} =nr.domain.com
RewriteRule ^https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<VirtualHost *:443>
ServerName nr.domain.com
SSLEngine On
<Location />
ProxyPass http://localhost:1880/
ProxyPassReverse http://localhost:1880/
</Location>

Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/nr.domain.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/nr.domain.com/privkey.pem
</VirtualHost>

Wenn ich mit ProxyPass ws:// usw. einen Standort hinzufüge, funktionieren zwar die Liveinfos und der Debugger, aber das Webinterface ist nicht mehr erreichbar. Wie ändere ich meine Apache-Konfigurationsdatei so, dass beides funktioniert?

Antwort1

Es sieht so aus, als ob Sie auch WebSocket-Verbindungen proxyen müssen, basierend aufdiese vorherige Antwort.

Versuchen Sie so etwas für Ihre Konfiguration.

<VirtualHost *:80>
  ServerName nr.domain.com
  Redirect permanent / https://nr.domain.com/
  RewriteEngine on
  RewriteCond %{SERVER_NAME} =nr.domain.com
  RewriteRule ^https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

<VirtualHost *:443>
  ServerName nr.domain.com
  SSLEngine On
  <Location />
    ProxyPass http://localhost:1880/
    ProxyPassReverse http://localhost:1880/
  </Location>

  # New web socket proxy
  <Location /comms>       
    ProxyPass ws://localhost:1880/comms
    ProxyPassReverse ws://localhost:1880/comms
  </Location>

  Include /etc/letsencrypt/options-ssl-apache.conf
  SSLCertificateFile /etc/letsencrypt/live/nr.domain.com/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/nr.domain.com/privkey.pem
</VirtualHost>

Antwort2

Um sowohl HTTP- als auch WebSocket-Verkehr für Node-Red über Ihren Apache-Reverse-Proxy zu ermöglichen, müssen Sie einige Änderungen an Ihrer Apache-Konfiguration vornehmen. Folgendes können Sie versuchen:

  1. Aktivieren Sie das WebSocket-Proxying, indem Sie dem Abschnitt „VirtualHost“ für Node-Red die folgenden Zeilen hinzufügen:
    <Location /ws>
      ProxyPass ws://localhost:1880/ws
      ProxyPassReverse ws://localhost:1880/ws
    </Location>

Dadurch wird Apache angewiesen, den gesamten WebSocket-Verkehr an Node-Red weiterzuleiten.

  1. Ändern Sie die vorhandenen Anweisungen ProxyPass und ProxyPassReverse, um den WebSocket-Endpunkt auszuschließen. Fügen Sie nach dem Tag aus dem vorherigen Schritt die folgende Zeile hinzu:
    ProxyPassMatch "^/(?!ws)(.*)" "http://localhost:1880/$1"

Dadurch wird Apache angewiesen, den gesamten HTTP-Verkehr mit Ausnahme des WebSocket-Endpunkts an Node-Red weiterzuleiten.

Der geänderte VirtualHost-Abschnitt sollte folgendermaßen aussehen:

<VirtualHost *:443>
  ServerName nr.domain.com
  SSLEngine On

  <Location /ws>
    ProxyPass ws://localhost:1880/ws
    ProxyPassReverse ws://localhost:1880/ws
  </Location>

  <Location />
    ProxyPassMatch "^/(?!ws)(.*)" "http://localhost:1880/$1"
    ProxyPassReverse http://localhost:1880/
  </Location>

  Include /etc/letsencrypt/options-ssl-apache.conf
  SSLCertificateFile /etc/letsencrypt/live/nr.domain.com/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/nr.domain.com/privkey.pem
</VirtualHost>

Starten Sie Apache neu, damit die Änderungen wirksam werden:

sudo systemctl restart apache2

Mit diesen Änderungen sollte sowohl der HTTP- als auch der WebSocket-Verkehr über Ihren Apache-Reverse-Proxy korrekt an Node-Red weitergeleitet werden.

verwandte Informationen