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

时间:2015-06-06 13:50:35

标签: node.js express socket.io elastic-beanstalk

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

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);
});

5 个答案:

答案 0 :(得分:8)

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

以下是an article,其中介绍了如何在代理中启用对webSockets的支持。

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

而且,即使是关于同一主题的StackOverflow问题/答案:

Websockets with socket.io on AWS Elastic Beanstalk

答案 1 :(得分:0)

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

答案 2 :(得分:0)

在.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

答案 3 :(得分:0)

我也遇到了这个问题。现在使用:

  • 在Elastic Beanstalk上:Nginx已关闭(尽管上面的解决方案应该可以工作,只是想逐步进行)。

  • 在Elastic Beanstalk上:负载均衡器,如下所示: https://i.ibb.co/Lp7P9fT/Screen-Shot-2019-10-07-at-2-48-02-PM.png (无法发布,信誉太低)

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

答案 4 :(得分:-5)

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