一个立刻要上线的无线项目须要使用软负载,和开发同窗讨论下来肯定用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下没法正常工做的。