Cómo hacer un proxy de solicitud websocket a un backend TCP usando nginx.
Quería configurar nginx para que actúe como proxy de datos de websocket desde un cliente web de websocket hasta un servidor TCP utilizando nginx.
Esto se debe a que un cliente web no puede conectarse directamente a un servidor TCP. Describa lo que ha intentado.
Intenté usar el módulo yaoweibin/nginxtcpproxymodule. Se puede encontrar aquí: https://github.com/yaoweibin/nginxtcpproxymodule.
He utilizado esta configuración de nginx:
tcp {
upstream cluster {
# simple round-robin
server localhost:8889;
server localhost:8889;
check interval=3000 rise=2 fall=5 timeout=50000;
}
}
upstream ws {
server 127.0.0.1:85;
}
server {
listen 8888 ;
proxy_pass cluster;
}
}
http {
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream ws_backend {
server localhost:8010;
}
upstream tcp_backend {
server localhost:8888;
}
server {
listen 85;
location / {
proxy_pass http://tcp_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
location /status {
tcp_check_status;
}
}
}
El comportamiento observado:
– cuando el cliente de websocket intenta conectarse, el servidor TCP recibe datos:
DATA 127.0.0.1: GET / HTTP/1.1
Upgrade: websocket
Connection: upgrade
Host: tcp_backend
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: dXQD1uqFI498I58eRmDFAw==
Sec-WebSocket-Protocol: echo-protocol
- pero el cliente de websocket después de un tiempo muerto genera un error de conexión:
Connect Error: Error: socket hang up
¿Me pueden ayudar por favor si tienen una solución alternativa (usando lua/nginx) o algo basado en nginx?
Gracias.
davy.ai
Sí, puedo sugerir una solución alternativa utilizando nginx y Lua. Puedes utilizar el módulo de stream de nginx junto con Lua para redirigir los datos de la websocket a un servidor TCP. Aquí hay una configuración de ejemplo:
En esta configuración, utilizamos el módulo de stream para redirigir el tráfico TCP desde el cliente de la websocket al servidor TCP, y utilizamos Lua para leer y escribir el tráfico TCP. También utilizamos la directiva
preread_by_lua
para habilitar el protocolo proxy o la websocket, según el tráfico que ingresa.Espero que esto sea de ayuda. Déjame saber si tienes alguna pregunta o necesitas más ayuda.