websockets nginx reverse proxy

nginx prend désormais en charge le proxy Websockets, mais je n’ai pas pu trouver d’informations sur la manière de procéder sans avoir un bloc d’ emplacement distinct qui s’applique aux URI sur lesquels les websockets sont utilisés.

J’ai vu des gens recommander des variantes de cette approche:

location / { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_pass http://host:port; } 

Est-ce que ce serait la bonne façon de proxy proxy HTTP standard ainsi que les websockets? Je ne souhaite pas que l’en-tête ou la connexion de mise à niveau soient définis sur «mettre à niveau» sauf si c’est ce que le navigateur a envoyé, mais ces lignes proxy_set_header sont requirejses pour que les Websockets fonctionnent. Pourquoi nginx ne fait-il que transférer les en-têtes de mise à niveau / connexion d’origine?

Je l’ai expérimenté et j’ai constaté que nginx ne prend pas en charge l’en-tête Upgrade et change l’en-tête Connection pour qu’il se ferme à partir de la mise à niveau s’il est exécuté sans les deux lignes proxy_set_header. Avec eux, Connection est une «mise à niveau» pour les requêtes non Websocket, ce qui est également mauvais.

Merci 🙂

Pourquoi nginx ne fait-il que transférer les en-têtes de mise à niveau / connexion d’origine?

A partir de la documentation officielle : le “Upgrade” étant un en-tête hop-by-hop, il n’est pas transmis d’un client à un serveur proxy

Voir RFC 2616 .


Je ne souhaite pas que l’en-tête ou la connexion de mise à niveau soient configurés sur «mettre à niveau» à moins que ce ne soit ce que le navigateur a envoyé,

Il y a aussi un exemple:

 map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { ... location /chat/ { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } } 

La connexion est une «mise à niveau» pour les demandes non Websocket, ce qui est également mauvais.

Savez-vous réellement ce que signifie l’en-tête de Connection ? Juste une citation de RFC: pour chaque jeton de connexion dans ce champ, supprimez tout champ d’en-tête du message portant le même nom que le jeton de connexion.

Comment ça peut être mauvais?