Lassen Sie NGINX WebSocket-Verbindungen im Reverse-Proxy automatisch aktualisieren

Lassen Sie NGINX WebSocket-Verbindungen im Reverse-Proxy automatisch aktualisieren

Ich habe mehrere Dienste, die ich hinter einem NGINX-Reverse-Proxy platziere, was einfach einzurichten war, aber ich bin auf ein Problem mit Websockets gestoßen. Ein einzelner Endpunkt lässt sich einfach mit einem Standort angeben, der Folgendes umfasst:

   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection "upgrade";

Das Problem ist, dass es viele Endpunkte mit WebSockets gibt. Und wir finden immer wieder neue Dinge, die nicht funktionieren, weil es noch einen weiteren WebSocket-Endpunkt gibt, von dem wir nichts wussten.

Gibt es eine Möglichkeit, den Header nur dann zu setzen, Upgradewenn Connectionder Client ihn übergibt? Wenn ich diese beiden Zeilen für den gesamten Dienst einschließe, versucht er, ein Upgrade durchzuführenjedenVerbindung, nicht nur die WebSockets.

Antwort1

Hatte gerade das gleiche Problem und kämpfte mit if-Anweisungen in der Nginx-Konfiguration und bemerkte diese Anweisungen:

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

Tu nichtses sei dennder Client hat einen UpgradeHeader gesetzt.

Anstatt also Locationfür jeden WebSocket-Endpunkt eine spezifische Direktive hinzuzufügen, können Sie einfach eine globale erstellen:

server {
  listen          443 ssl;
  server_name     my-server.example
  location / {
    proxy_pass http://local-service.example/;
    proxy_http_version 1.1;
    proxy_read_timeout 86400s;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

  }
}

Dieser Proxy verarbeitet alle HTTP-Anfragen und sorgt dafür, dass WebSockets für den gesamten Namespace funktionieren. Dies funktioniert, weil es $http_upgradefür Nicht-WebSocket-Anfragen leer ist.

verwandte Informationen