Tengine 2.0.3 + Tomcat 7.0.55 开启健康检查的注意事项

一个马上要上线的无线项目需要使用软负载,和开发同学讨论下来确定用Tengine+Lua Module来做,前端Tengine 2.0.3,后端服务Tomcat 7.0.55。Tengine相关配置如下:

Tengine 2.0.3 + Tomcat 7.0.55 开启健康检查的注意事项_第1张图片

在开发机上搭环境时发现开启健康检查功能总是报错:

Tengine 2.0.3 + Tomcat 7.0.55 开启健康检查的注意事项_第2张图片

刚开始怀疑是不是当Tengine和后端服务部署在同一个机器上时,健康检查不能正常工作,就在Tengine的github上建了一个issue询问。详见:https://github.com/alibaba/tengine/issues/518#issuecomment-57655581。不到2个小时就有一名开发同学给了回复,在节假日也响应的这么快,真心赞 : )虽然响应速度非常给力,明确在同一台机器上是可以进行健康检查的,但是并没有给出在上述环境健康检查失败的原因。还得继续找问题。

因为以前曾经使用Tengine 1.5搭建过类似的环境,并没有出现这个问题,所以去Tengine官网上查看changelog,发现Tengine 2.0的确在健康检查的处理上进行了修改,在健康检查中使用了KeepAlive来降低系统的开销。问题会不会出在这儿?

为了能准确地排查这个问题,打算先绕开Tengine,直接使用curl向提供后端服务的Tomcat按四种形式发送HEAD请求:HTTP/1.0 不带KeepAlive标签、HTTP/1.0带KeepAlive标签、HTTP/1.1不带KeepAlive标签和HTTP/1.1带KeepAlive标签。执行的结果如下:

1. HTTP/1.0 不带KeepAlive标签:

Tengine 2.0.3 + Tomcat 7.0.55 开启健康检查的注意事项_第3张图片

从上图可以看出,命令执行后,连接就会被立即切断。

2. HTTP/1.0带KeepAlive标签:

Tengine 2.0.3 + Tomcat 7.0.55 开启健康检查的注意事项_第4张图片

从上图可以看出,服务器正常识别了KeepAlive标签,并没有切断连接。

3. HTTP/1.1不带KeepAlive标签:

Tengine 2.0.3 + Tomcat 7.0.55 开启健康检查的注意事项_第5张图片

4. HTTP1.1带KeepAlive标签:

Tengine 2.0.3 + Tomcat 7.0.55 开启健康检查的注意事项_第6张图片

由于HTTP/1.1协议默认是认为客户端支持KeepAlive的,所以无论带不带KeepAlive标签,服务器都会按照KeepAlive来处理。如果想在HTPP/1.1协议下关闭KeepAlive,需要在Header上加上“Connection: close”。

5. HTTP1.1带close标签:

Tengine 2.0.3 + Tomcat 7.0.55 开启健康检查的注意事项_第7张图片

可以从上图中看出,服务在发送完response后立即关闭了连接,而这时,客户端还处于正在读数据的状态。

会不会是Tengine 2.0.3在处理KeepAlive的方式上和Tomcat7.0.55不兼容呢?于是将check_http_send的参数改为:

check_http_send "HEAD / HTTP/1.0\r\nConnection: keep-alive\r\n\r\n";

一次通过!

下次有空了,需要查看一下Tengine的代码,看看究竟是什么原因导致HTTP/1.1下无法正常工作的。













你可能感兴趣的:(Tengine 2.0.3 + Tomcat 7.0.55 开启健康检查的注意事项)