由 Apache KeepAlive 引发的 HTTP 探测问题及解决办法
Kyle Fu 2017/07/11
Azure 负载均衡器的运行状况探测支持 TCP 和 HTTP 两种探测方式。TCP 探测是对被检测的 TCP 端口
进行连接(TCP 三次握手),通过 TCP 会话能否成功建立来判断服务是否正常。而 HTTP 探测则是向被检
测的 HTTP 服务发送 Get 请求,对方返回“HTTP 200 OK”的响应后,Azure 则认为服务正常。
问题描述
在实际使用过程中,我们发现当负载均衡器的后端为 Apache Web Server,启用了 KeepAlive 并且使
用默认设置时(不同版本的 Apache,KeepAlive 可能默认开启或者关闭),偶尔会引发 HTTP 探测失败,
进而导致后端这台虚拟机的 Web 服务被标记为宕机。负载均衡器会中断之前连接在这台虚拟机中的 TCP
会话,转而向它认为健康的虚拟机建立新的 TCP 连接。如果这些被中断的 TCP 会话包含用户的登录信息,
而这些信息没有同步到其它后端虚拟机时,会话重置后这些信息会丢失,最终导致用户被登出。
发生原因
经研究发现,这个问题与 Azure 负载平衡器运行状态探测和 Apache KeepAlive 配置有关。
HTTP 探测配置中时,默认间隔是 5 秒,如下图。这样,Azure 会每隔 5 秒向后端池中的所有 HTTP
服务发送一个 HTTP 的 Get 请求。