使用 AWS 和 Elastic Beanstalk 的 Websocket
Posted
技术标签:
【中文标题】使用 AWS 和 Elastic Beanstalk 的 Websocket【英文标题】:Websockets with AWS and Elastic Beanstalk 【发布时间】:2015-02-10 17:16:09 【问题描述】:我正在尝试让我的 websocket 与 Amazon Web Service 和 Elastic Beanstalk (ELB) 一起使用。
我根据以下设置代理协议: http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/enable-proxy-protocol.html
我已经在所有端口上为所有 IP 开放了到我的负载均衡器和其他安全组的所有入站流量。
我还将负载平衡器侦听器保留为端口 80 上的 HTTP。
尝试连接端口 80 时,我的 websocket 连接出现以下错误: 失败:WebSocket 握手期间出错:意外响应代码:400
端口 8080 上出现此错误: 失败:连接建立错误:net::ERR_CONNECTION_REFUSED
不胜感激,我被困在这一点上。
谢谢!
【问题讨论】:
你找到解决办法了吗,我也遇到了同样的问题 github.com/Automattic/socket.io/issues/1846 在使用 HTTP 侦听器进行设置时,Amazon 的弹性负载均衡器目前似乎不支持 Web 套接字。建议的解决方法是使用基于 TCP 的侦听器。请参阅上面的链接。 您是否知道如果没有负载均衡器这是否可行?例如,只有一个实例的 EB 应用程序? 然后用单个实例创建一个负载均衡器 ;) 【参考方案1】:这是一篇非常古老的帖子,但在四处寻找答案后,我发现您需要做两件事才能在与 AWS EB 一起使用的自定义端口上获取 websocket。
在你的EB环境配置下。转到软件并在那里添加一个环境变量。确保这与您的代码匹配区分大小写。
再次在您的 EB 环境的配置下。转到负载均衡器并将自定义端口添加为侦听器。
确保将新的侦听器保存在配置下,并在重新加载时将 websocket 流量路由到自定义端口
【讨论】:
【参考方案2】:您应该为 nginx 服务器创建反向代理。您可以在 .ebextensions 文件夹中包含此 config file 以使 Nginx 支持 WS。
此外,在 EBS 的负载平衡器配置中,将协议从 HTTP 更改为 TCP。
请参阅此blog 以设置安全 WebSocket。
【讨论】:
我有一个带有 WebSocket 的 java 应用程序我该如何配置。【参考方案3】:AWS 推出了支持 Web 套接字的新应用程序负载均衡器。将您的 ELB 更改为 Application Load Balancer,这将解决您的问题。
https://aws.amazon.com/blogs/aws/new-aws-application-load-balancer/
【讨论】:
【参考方案4】:配置 EC2 安全组后,您的应用程序将使用公共 IP。
但是您仍然会遇到使用 EB URL 的问题。 要解决此问题,您必须更改 EB 配置。
-
转到 EB 环境页面
配置
在负载平衡部分将协议从 HTTP 更改为 TCP。
现在您可以点击 EB URL。
【讨论】:
您是否知道如果没有负载均衡器这是否可行?例如,只有一个实例的 EB 应用程序?【参考方案5】:我也在寻找可能的解决方法来解决这个问题,但是无论您使用什么平台语言在 AWS EC2 上开发 websocket 程序,它都非常容易,就像在我的情况下使用 Node.js nginx 一样,这应该适用于所有人支持平台。
配置安全组
-
在 AWS 控制台中,打开 EC2 选项卡。
选择相关区域并点击安全组。
你应该有一个 elasticbeanstalk-default 安全组,如果你
已在该区域为您启动了 Elastic Beanstalk 实例
应用程序。
点击顶部的操作按钮,然后选择编辑入站规则。
在此处类型列中选择所有 TCP,或者您可以设置一些自定义 TCP
规则以及监听你的 websocket 端口。
就是这样!
注意:如果出现问题,请检查 Beanstalk 应用程序/环境中的“事件”选项卡并找出问题所在。
【讨论】:
以上是关于使用 AWS 和 Elastic Beanstalk 的 Websocket的主要内容,如果未能解决你的问题,请参考以下文章
使用 AWS CodeBuild 和 EB CLI 部署到 AWS Elastic Beanstalk
如何知道我是不是需要使用 AWS Elasticache 和 AWS Elastic Load Balancing?
如何使用 aws cli 在 Elastic Beanstalk 上上传和部署?