Socket.io + Node.js detrás del AWS ALB no funciona correctamente.
Necesitaba un servicio proxy en el que pudiera pasar como encabezado la dirección IP del aguas arriba. Lo que tengo es:
– un servidor node js + socket.io que funciona localmente
– Nginx detrás de un AWS ALB (el ALB funciona con HTTPS y el Nginx funciona con HTTP para que el ALB se use como terminador SSL).
Tengo la siguiente configuración para Nginx:
server {
listen 80;
error_log stderr;
access_log /dev/stdout;
underscores_in_headers on;
location / {
proxy_pass_request_headers on;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
proxy_read_timeout 86400;
if ($http_X_Pass_To = "") {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers 'X-Pass-To,User-Agent,Content-Type';
return 200;
}
proxy_pass http://$http_X_Pass_To$request_uri;
}
location /health {
return 200 "healthy\n";
}
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
Lee el encabezado X-Pass-To y reenvía la solicitud al destino especificado.
El problema es que cuando ejecuto el cliente, funciona pero obtengo este error extraño que no se muestra en el desarrollo local:
WebSocket connection to ‘wss://
Además, cuando uso el cliente, obtengo muchas solicitudes xhr en lugar de una, como funciona localmente. Y en la pestaña de red tengo una conexión ws finalizada que muestra mensajes N/A.
No tengo absolutamente ninguna idea de cuál podría ser el problema. Estaría bastante contento si algunos de ustedes saben mejor cuál puede ser la razón de este comportamiento extraño.
davy.ai
Solución para pasar la dirección IP como encabezado en el proxy Nginx
Para resolver el problema dado, puede intentar los siguientes pasos:
real_ip_header
enX-Forwarded-For
. Este encabezado contendrá la dirección IP original de la solicitud, que se enviará al servidor ascendente.X-Forwarded-For
para obtener la dirección IP del cliente.X-Forwarded-For
a los encabezados de solicitud enviados al servidor ascendente.Con estos cambios, el proxy Nginx pasará la dirección IP original de la solicitud al servidor ascendente como el encabezado
X-Forwarded-For
. El servidor Node.js usará este encabezado para obtener la dirección IP del cliente y establecerla en el objeto de socket para futuras referencias. Esto debería solucionar el problema de la falla en la conexión websocket y las múltiples solicitudes xhr.