Problema de WebSocket en AWS Elastic Beanstalk mediante el puerto 80

Estoy migrando una aplicación node.js de Heroku a AWS Elastic Beanstalk que usa WebSockets en el puerto 80. Los WebSockets están devolviendo un error 301 en AWS Elastic Beanstalk, pero no en Heroku.

Para inicializar una conexión WebSocket, haga clic en Create a new note .

AWS Beanstalk http://default-environment.psgekxtsbd.us-west-2.elasticbeanstalk.com/

Heroku https://murmuring-shelf-40601.herokuapp.com/

Así es como estoy configurando los WebSockets en el servidor.

 const express = require('express'); const app = express(); require("express-ws")(app); app.post("/service/create-account/", (req, res)=> {/*code in here*/}); app.ws('/:noteId/', function (ws, req) {/*code in here*/}); const port = process.env.PORT || 3000; app.listen(port); 

He intentado agregar diferentes configuraciones en la carpeta .ebextensions como,

 files: "/etc/nginx/conf.d/01_websockets.conf" : mode: "000644" owner: root group: root content : | upstream nodejs { server 127.0.0.1:80; keepalive 256; } server { listen 80; large_client_header_buffers 8 32k; location / { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; # prevents 502 bad gateway error proxy_buffers 8 32k; proxy_buffer_size 64k; proxy_pass http://nodejs; proxy_redirect off; # enables WS support proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } 

Y

 files: "/etc/nginx/conf.d/websocketupgrade.conf" : mode: "000755" owner: root group: root content: | proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; 

Cuando agrego estas configuraciones, el HTML no se carga con el error ERR_NAME_NOT_RESOLVED . Aquí está la URL http://websocketsissue.us-west-2.elasticbeanstalk.com/

Configuré mi entorno elástico de beanstalk como un entorno de servidor web utilizando la configuración predefinida para Node.js. No he añadido ningún recurso adicional.

¿Hay alguna forma de hacer que WebSockets funcione en el puerto 80 utilizando AWS Elastic Beanstalk?

Actualizar

Pude hacer que el entorno de una sola instancia funcionara, pero no el entorno de escalado automático y con carga equilibrada.

Para que la única instancia funcione, agregué el siguiente archivo a .ebextensions

 container_commands: 01_nginx_websocket_support: command: | sed -i '/\s*proxy_set_header\s*Connection/c \ proxy_set_header Upgrade $http_upgrade;\ proxy_set_header Connection "upgrade";\ ' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf 

Encontré parte de la respuesta aquí, https://scopestar.com/blog/aws/elasticbeanstalk/websockets/2016/10/21/enable-websockets-on-elasticbeanstalk-nginx-proxy.html

.ebextensions un archivo en la carpeta .ebextensions con el siguiente contenido y lo arreglé para entornos de instancia única.

 container_commands: 01_nginx_websocket_support: command: | sed -i '/\s*proxy_set_header\s*Connection/c \ proxy_set_header Upgrade $http_upgrade;\ proxy_set_header Connection "upgrade";\ ' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf 

Para hacer que los WebSockets funcionen en el entorno de escalado automático y equilibrado de carga, necesitaba hacer lo siguiente, además:

  • Ir al panel de EC2
  • Encuentra el Load Balancer que creó el proyecto Elastic Beanstalk
  • Haga clic derecho en el Load Balancer y haga clic en Editar oyente
  • Cambie el Protocolo de equilibrio de carga de HTTP a TCP para el puerto 80 y guarde los cambios