nginx proxy inverso websockets
socket io nginx reverse proxy (1)
¿Por qué nginx no reenvía los encabezados de actualización / conexión originales?
De la documentación oficial : ya que la "Actualización" es un encabezado salto a salto, no se pasa de un cliente a un servidor proxy
Ver RFC 2616 .
No quiero que el encabezado o la conexión de la actualización estén configurados para "actualizar" a menos que eso sea lo que envió el navegador.
También hay un ejemplo:
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 conexión es ''actualizar'' para solicitudes que no sean websocket, lo que también es malo.
¿Sabes realmente lo que significa el encabezado de Connection
? Solo una cita de RFC: para cada token de conexión en este campo, elimine cualquier campo de encabezado del mensaje con el mismo nombre que el token de conexión.
¿Cómo puede ser malo?
nginx ahora admite proxy websockets, pero no pude encontrar ninguna información sobre cómo hacerlo sin tener un bloque de ubicación independiente que se aplique a los URI en los que se utilizan websockets.
He visto a algunas personas recomendar algunas variaciones de este enfoque:
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://host:port;
}
¿Sería esa la forma correcta de proxy HTTP estándar así como websockets? No quiero que el encabezado o la conexión de la actualización estén configurados para "actualizar" a menos que eso sea lo que envió el navegador, pero estas líneas proxy_set_header son necesarias para que los websockets funcionen. ¿Por qué nginx no reenvía los encabezados de actualización / conexión originales?
Experimenté con esto y descubrí que nginx no apunta el encabezado de la Actualización y cambia el encabezado de la Conexión para ''cerrar'' desde ''actualizar'' si se ejecuta sin las dos líneas proxy_set_header. Con ellos, Connection es ''actualización'' para solicitudes que no son websocket, lo que también es malo.
Gracias :)