ElasticBeanstalk 上的 Websockets 给出 404
Posted
技术标签:
【中文标题】ElasticBeanstalk 上的 Websockets 给出 404【英文标题】:Websockets on ElasticBeanstalk giving 404 【发布时间】:2015-07-29 05:42:13 【问题描述】:我正在尝试将 websocket 服务器部署到 Elastic Beanstalk。 我有一个包含 nginx 和 jar 服务器的 Docker 容器,而 nginx 只是进行转发。 nginx.conf 是这样的:
listen 80;
location /ws/ # <-- this part only works locally
proxy_pass http://127.0.0.1:8090/; # jar handles websockets on port 8090
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
location / # <-- this part works locally and on ElasticBeanstalk
proxy_pass http://127.0.0.1:8080/; # jar handles http requests on port 8080
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
我可以在本地运行这个 docker,一切正常 - 提供了 http 请求,我可以使用 ws://localhost:80/ws/
连接 websocket 但是,当我部署到 Elastic Beanstalk 时,http 请求仍然可以,但尝试在 @ 上连接 websocket 987654323@ 给出 404 错误。我是否需要其他东西来允许 Elastic Beanstalk 上的 websocket?
【问题讨论】:
【参考方案1】:好的,开始工作了。我需要 ElasticBeanstalk 负载均衡器来使用 TCP 而不是 HTTP。
要从 AWS 控制台执行此操作(如 2015 年 5 月 16 日所述),请转到您的 ElasticBeanstalk 环境,在左侧菜单中选择“配置”,在“网络层”下有一个“负载平衡”窗格.点击它的齿轮,然后你可以将负载均衡器协议从 http 更改为 tcp。
【讨论】:
可行,但我建议使用 ebextensions 并设置选项设置以将协议设置为 tcp。这样,如果您重建环境或克隆环境,负载均衡器上的设置将保持不变。您可以通过在您的应用程序中使用选项设置“namespace:aws:elb:loadbalancer”和“option_name:LoadBalancerProtocol”和“value:TCP”创建一个文件.ebextensions/load_balancer.config
来做到这一点。如果您将此应用程序源部署到您的环境,则设置将在重建、克隆和保存的配置中保持不变。
支持的选项设置列表可在此处获得:docs.aws.amazon.com/elasticbeanstalk/latest/dg/… 这是如何在 ebextensions 配置文件中设置选项设置的示例docs.aws.amazon.com/elasticbeanstalk/latest/dg/… 该文件为 yaml 格式
我当然同意最好让它在 cli 中运行。我不知道您的.ebextensions
方法,因为我一直设法避免它。相反,我通过使用aws elasticbeanstalk create-environment
并使用--option-settings
传递您建议的LoadBalancerPortProtocol
(尽管您可能有错字?)。
我明白了……选项设置可以通过 API/CLI/ebextensions 进行设置。它们都是等价的。当我最初阅读您的答案时,我误解了您直接在负载均衡器上修改了属性,但是由于您通过 beanstalk 控制台修改了负载均衡器设置,因此控制台通过 API 设置选项设置,这类似于通过 ebextensions 设置它。本质上,当您通过 beanstalk 控制台、api、cli 或 ebextensions 执行此操作时,状态会保留在您的环境配置中。以上是关于ElasticBeanstalk 上的 Websockets 给出 404的主要内容,如果未能解决你的问题,请参考以下文章
Elasticbeanstalk 上的 Flask-socketIO
如何将 elasticbeanstalk.com 上的 Apache 支持的代理重定向到自定义域?
绕过 Elasticbeanstalk 中托管的 api 响应上的 NGINX 413 错误页面
Amazon ElasticBeanstalk 上的 Ruby on Rails 部署:签名过期错误