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

一个立刻要上线的无线项目须要使用软负载,和开发同窗讨论下来肯定用Tengine+Lua Module来作,前端Tengine 2.0.3,后端服务Tomcat 7.0.55。Tengine相关配置以下:前端

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


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

由于之前曾经使用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标签:curl

从上图能够看出,命令执行后,链接就会被当即切断。url

2. HTTP/1.0带KeepAlive标签:
开发

从上图能够看出,服务器正常识别了KeepAlive标签,并无切断链接。部署

3. HTTP/1.1不带KeepAlive标签:get

4. HTTP1.1带KeepAlive标签:

因为HTTP/1.1协议默认是认为客户端支持KeepAlive的,因此不管带不带KeepAlive标签,服务器都会按照KeepAlive来处理。若是想在HTPP/1.1协议下关闭KeepAlive,须要在Header上加上“Connection: close”。

5. HTTP1.1带close标签:

能够从上图中看出,服务在发送完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下没法正常工做的。

相关文章
相关标签/搜索