Confluence、Jira访问返回的状态码是:HTTP/1.1 200,而Varnish对后端探活检测的状态要求是:HTTP/1.1 200 OK,(关于协议规范,请大家自己搜索补全),因此,虽然是200的访问请求,但是检测认为是“Still sick”。
0 Backend_health - www Still sick 4--X-R- 0 3 5 0.092781 0.000000 HTTP/1.1 200
追溯Confluence、Jira使用的WebServer是Tomcat,查找相关文档资料了解到:
tomat8.5以上默认不发送http描述字符,可以配置。
tomcat9以上不发送描述字符,并且没有办法配置。
对tomcat9以下的版本,在tomcat的server.xml文件里面修改一下:
在Connector配置中,增加 sendReasonPhrase="true"
<Connector sendReasonPhrase="true" port="8080"
但是对于tomcat9以上的版本,就无解了。
随后想到,为了业务及设备复用,Confluence和Jira的前面都是用Nginx做的Proxy,那可以从Nginx层面,使用Lua对返回的状态码做调整,实现 HTTP/1.1 200 OK 格式规范。
location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; header_filter_by_lua ' if ngx.status == 200 then ngx.status = ngx.HTTP_OK end '; }
重载Nginx配置后,查看Varnish Log,果然恢复正常
0 Backend_health - www Still healthy 4--X-RH 5 3 5 0.094267 0.097442 HTTP/1.1 200 OK