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, Upgrade
wenn Connection
der 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 Upgrade
Header gesetzt.
Anstatt also Location
fü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_upgrade
für Nicht-WebSocket-Anfragen leer ist.