亚马逊弹性负载均衡器没有关闭与服务器的连接。

8
我可以帮助您翻译。这段内容是关于编程的。

我有一个带有Apache反向代理和ffserver流媒体服务器的EC2实例。在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 用于在互联网上直播音频。在 ffserver 的设置中有一个 MaxBandwidth 选项(默认值为 1000)。当连接没有正确关闭时,这个设置会成为一个问题。 ffserver 开始响应 503 server too busy 而不是流内容。

如果我直接连接服务器(没有 ELB),一切正常。如果通过 ELB 连接,则在客户端关闭连接时(例如关闭浏览器的标签页)连接不会关闭。

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

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

所有连接都会一直保持在已建立状态(至少30分钟)。ELB的默认空闲超时时间为60。这意味着有人正在从ffserver接收流(连接处于活动状态)。
编辑:看起来将经典负载均衡器更改为应用程序负载均衡器解决了问题。我不知道如何解释这种行为。期待AWS社区的回答- AWS论坛

1
我之前听到过这方面的传闻...好像ELB在客户端断开连接时并没有像预期那样切断连接,只要服务器继续发送数据。为了澄清一下,ELB是在TCP模式还是HTTP模式下? - Michael - sqlbot
这是HTTP模式。由于Apache目前似乎缺乏对代理协议的良好支持,因此我需要X-Forwarded-For头信息。 - Mateusz Kleinert
只是想知道,客户端是否开启了HTTP keep-alive?这可以解释为什么ELB从不超时(也可以解释为什么ALB可以解决此问题)。 - tukan
您可以尝试添加 ping=1 以查看后端是否繁忙。 https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass - Aleksandar
2个回答

6
如 OP 在他的编辑中分享的那样,连接未关闭的问题可以通过更改负载均衡器类型来解决。本答案重点介绍为什么这种变化会产生这样的影响?

Classic Load Balancer(ELB)似乎存在问题。我找到了以下帖子,其中有非常相似的问题:

看起来问题源于ELB无法检测到客户端从连接中断开。特别是当后端以某种周期性方式提供某些数据时,例如实时音频流、心跳等。

目前似乎没有禁用负载均衡器的keep-alive设置的方法, 但仅在ELB上出现此问题。

我找不到导致ELBALB之间行为差异的确切功能。我认为原因可能是由于;

  • ALB中改进的健康检查, 和/或
  • 一种对我们用户不可见的内部结构差异,以某种方式防止此问题在ALB上发生

我认为使用应用程序负载均衡器(ALB)时,该问题会得到解决,因为它具有所述的改进,并且更加灵活。

请查看这里了解ELBALBNLB之间的区别。


PS. AWS的支持论坛很糟糕,所有好的支持和技巧都被设置为付费,并存储在他们与其高级客户之间的私信中。


1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接