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 部署:签名过期错误

Docker 平台上的 elasticbeanstalk:react 应用程序的 502 Bad Gateway

AWS ElasticBeanstalk 上的 502 错误网关 Nginx 节点