我们有弹性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);
});
答案 0 :(得分:8)
默认情况下,弹性beanstalk实例前面有一个nginx代理,它没有配置为允许webSockets。您可以关闭代理,也可以配置nginx实例以支持webSockets。
以下是an article,其中介绍了如何在代理中启用对webSockets的支持。
而且,即使是关于同一主题的StackOverflow问题/答案:
答案 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 (无法发布,信誉太低)
const io = require('socket.io')(3030)
let connection = io(https://www.myurl.com:3030)
答案 4 :(得分:-5)
这是安全限制的问题。否则代码工作正常。谢谢你的帮助。