Amazon Elastic Load Balancer 未关闭与服务器的连接

Amazon Elastic Load Balancer is not closing the connection to the server

我有一个 EC2 实例,其中 Apache 作为反向代理,ffserver 作为流媒体服务器。在 EC2 实例前面有一个 ELB (Classic) 作为 SSL 终止点。

Apache配置相当简单:

<Location "/mp3/">
    ProxyPass http://127.0.0.1:8081/ DisableReuse=On KeepAlive=Off
    ProxyPassReverse http://127.0.0.1:8081/
    SetEnv force-proxy-request-1.0.1
    SetEnv proxy-nokeepalive 1
</Location>

ffserver 用于通过 Internet 流式传输实时音频。在 ffserver 的设置中有一个 MaxBandwidth 选项(默认 1000)。当连接未正确关闭时,此设置会成为问题。 ffserver 开始响应 503 server too busy 而不是流的内容。

如果我直接连接到服务器(路上没有ELB)一切正常。如果我通过 ELB 连接,当我在客户端关闭它时连接不会关闭(例如关闭浏览器的选项卡)。

我使用以下命令检查当前连接:

watch -n 2 'netstat -napt | grep 8081'

所有连接永远保持 ESTABLISHED 状态(至少 30 分钟)。 ELB 的默认空闲超时为 60。这意味着有人正在从 ffserver 接收流(连接处于活动状态)。

编辑:看起来将 Classic Load Balancer 更改为 Application Load Balancer 解决了问题。我不知道如何解释这种行为。期待 AWS 社区的回答 - AWS Forums

正如 OP 与他的编辑分享的那样,连接未关闭的问题可以通过更改负载均衡器类型来解决。这个答案主要集中在为什么这个变化会产生这样的影响?


Classic Load Balancer (ELB) 中似乎存在问题。我发现以下帖子有非常相似的问题;

问题似乎源于 ELB 无法检测到客户端断开连接。特别是当 back-end 定期提供某种数据时,例如实时音频流、心跳等

好像没有a way to disable the keep-alive setting of load balancers,但是不知怎么的,只有ELB才会出现这个问题。

我找不到造成 ELBALB 之间这种行为差异的确切特征。我认为原因是由于;

我认为由于上述改进而使用 Application Load Balancer (ALB) 时问题会解决,而且它更加灵活。

查看 here 了解更多关于 ELBALBNLB

之间差异的信息

ps。 AWS 支持论坛很糟糕,所有好的支持和 tips 都被付费墙存储在他们和他们的高级客户之间的 PM 中。

我知道这是一个旧线程,但我最近遇到了同样的问题,解决方案是切换到 ALB。之后工作正常。