天行健,君子以自强不息;地势坤,君子以厚德载物;

Tomcat不返回HTTP/1.1 200 OK的问题解决

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

 

点赞

发表评论