【问题标题】:Websockets on ElasticBeanstalk giving 404ElasticBeanstalk 上的 Websockets 给出 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?

【问题讨论】:

    标签: nginx jar websocket amazon-elastic-beanstalk


    【解决方案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 执行此操作时,状态会保留在您的环境配置中。
    猜你喜欢
    • 2020-11-08
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    相关资源
    最近更新 更多