如何在同一个弹性beantalk实例上运行 socket.io和express?

How to run socket.io and express on the same elastic beanstalk instance?

我们有弹性 beantalk 实例,我们有一些休息服务和 socket.io。 express 正在启动广告端口 80。我在 3001 启动 socket.io。但无法连接此套接字。我也关闭了代理,从 nginx 到关闭。 套接字代码如下

var express         = require('express'),
    app             = express(),
    server          = require('http').createServer(app),
    io              = require('socket.io')(server), //make sockets
    port            = 3001;//port for socket

//initiate server
server.listen(port, function () {
    console.log('Socket.io listening at port %d', port);
});

我不能肯定地说,但我认为您的安全组上没有打开端口 3001。您必须允许 eb 应用程序的 ec2 sg 端口 3001 上的流量,以便您的 elb 应用程序的 ELB 可以访问。此外,确保配置 ELB 的 SG,以便互联网上的任何人都可以通过 ELB 访问 EC2 实例上的 socket.io 端口。但是,您需要使用基于 TCP 的侦听器并启用代理协议才能使 socket.io 正常工作。我没有检查过这个,但我认为你不能在侦听器部分配置端口 3001。在这种情况下,您可以使用 nginx 并配置上游和位置块,以便您发送请求来纠正上游。您可以查看基于 .ebextensions 的配置,以便您可以在部署期间适当地替换 nginx 配置。这样做的缺点是您的脚本可能需要随着 elastic beanstalk 解决方案堆栈的升级而更改。

默认情况下,弹性 beantalk 实例前面有一个未配置为允许 webSockets 的 nginx 代理。您可以关闭代理,也可以配置 nginx 实例以支持 webSockets。

这里 an article 描述了如何在代理中启用对 webSockets 的支持。

并且,这里有两篇文章描述了完全禁用代理 here and here

而且,即使是关于同一主题的 Whosebug question/answer:

Websockets with socket.io on AWS Elastic Beanstalk

这是安全限制问题。否则代码工作正常。谢谢大家的帮助。

在 .ebextensions 中创建一个新的配置文件。

添加这个:

container_commands:
 enable_websockets:
  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

我也运行遇到这个问题。现在正在与:

  • 在 Elastic Beanstalk 上:Nginx 已关闭(虽然上述解决方案应该有效,只是想逐步解决)。

  • 在 Elastic Beanstalk 上:负载均衡器如下所示: https://i.ibb.co/Lp7P9fT/Screen-Shot-2019-10-07-at-2-48-02-PM.png (还不能post,声望太低)

  • 在Node/Express中:const io = require('socket.io')(3030)
  • 在客户端:let connection = io(https://www.myurl.com:3030)