tengine中后端服务器健康检查模块ngx_http_upstream_check_module可以主动向后端服务器定时发送请求以检测后端服务器的存活状态,这个功能很实用。原来一直按照官方文档配置的:
#注意,后端服务器长连接超时时间要大于interval,要不然没啥意义
check interval=10000 rise=2 fall=5 timeout=2000 default_down=false type=http;
check_http_send "GET / HTTP/1.0\r\n\r\n"
check_http_expect_alive http_2xx http_3xx;
一切正常,但是发现会积累多个处于TIME_WAIT的连接,如此一来,感觉甚是不爽。心想,如果可以使用HTTP1.1 长连接就好了(后端服务器支持长连接,并且超时时间大于interval的设置),查看官方文档说可以启用长连接,原文是这样说的:
当采用长连接进行健康检查时,需在该指令中添加keep-alive请求头,
如:"HEAD / HTTP/1.1\r\nConnection: keep-alive\r\n\r\n"。
于是直接复制了上去,然后重新加载配置文件,以为万事大吉。结果不一会,网站无法访问了,赶紧查看upstream check status,发现配置的upstream都被标示为down的状态。赶紧去看了一下后端服务的日志,看到一堆Http 400 的日志。心中很是疑惑,官方的配置也是这样,没啥错啊,怎么就不能用了呢。再三检查自己没有写错东西后,去google搜索了一番,终于找到了一个类似的问题。文章的大概意思是,如果后端服务器对于Http1.1的协议检测比较严格,则HEAD请求时必须加上Host字段。
接着,按照文章的意思,尝试性的把相关配置更改如下:
check interval=10000 rise=2 fall=5 timeout=2000 default_down=false type=http;
check_keepalive_requests 100;
check_http_send "HEAD /css/main.css HTTP/1.1\r\nConnection: keep-alive\r\nHost: check.com\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
然后,重启nginx服务。查看后端日志,已经正常,并且这些请求长连接已经启用,网站也可以正常访问。
问题到此解决。ps:Host字段的值可以根据自己的需求写,这里我随便写了个 check.com