我有一个 EC2 实例,Apache 作为反向代理,ffserver 作为流服务器。 EC2 实例前面有一个 ELB(经典),用作 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
无法检测到客户端从连接中断开。特别是当后端以定期方式提供某种数据时,例如实时音频流、心跳等。好像没有a way to disable the
keep-alive
setting of load balancers ,然而,不知何故,只有 ELB
出现这个问题。我找不到在
ELB
之间造成这种行为差异的确切功能& ALB
.我认为原因要么是由于;ALB
,和/或 ALB
由于上述改进,我认为使用 Application Load Balancer (
ALB
) 时问题会解决,并且它更加灵活。查询 here有关
ELB
之间差异的更多信息, ALB
, 和 NLB
附: AWS 支持论坛很糟糕,所有好的支持和技巧都是付费的,并存储在他们和他们的高级客户之间的 PM 中。
关于apache - Amazon Elastic Load Balancer 未关闭与服务器的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43350862/