Tomcat竟然有bug,这我能信?
副问题[/!--empirenews.page--]
配景先容 为了办理漫衍式链路追踪的题目,我们引入了实现OpenTracing的Jaeger来实现。然后我们为SpringBoot框架写了一个starter以让用户实现近零改革接入全链路。 因为公司有一个封装了SpringBoot的内部框架,然后我们的starter就以最新框架所行使的SpringBoot版本为基本举办开拓。以是营业体系在接入的时辰必要先辈级框架,然后再引入我们的starter才行无缝接入全链路。 妨碍描写 然后有一个营业体系就凭证步调,进级框架,引入starter就接入了全链路体系,而且成果测试压力测试都已经通过了。功效我们满怀信念地就上线了。功效,线上nginx报大量http 400错误。 妨碍排查 呈现妨碍后,营业体系的研发职员查了全部的日记,包罗elk以及呆板上的日记,都没有发显着显的错误日记。这个就。。。 几番挣扎后照旧没有在线上的日记中找到任何蛛丝马迹。这个就较量绝望了。更稀疏的是在测试情形中是正常的,这个就较量诡异了。 然后我们意料是不是之前压力测试做得不足啊,我们照旧在压测情形中再压测一下看看会不会复现。然后正好之前这个营业体系做过压测,那就赶忙找运维搭建一个压测情形。功效刚搭建完就很是给体面地复现了400错误。 然后运维同窗就各类折腾,然后神奇般地在nginx中的location下加了一行设置后就好了。
然后就开始各类查这个设置是啥意思。 这个设置的首要是在nginx在转发htp哀求的时辰会加上现实的Host哀求头。如http哀求是 http://abc.com/hello,那么nginx在转发http哀求的时辰会原封不动的把host哀求头(Host:abc.com)转发给靠山处事。对付nginx而言,假如没有设置proxy_set_header HOST $host的时辰会默认修改Host为upstream的名称。 然后我们又在压测情形中试了一下修改之前的版本,发明是正常的。 我们nginx的设置概略如下: 那总结一下此刻的征象:
那我们到底修改了什么呢?
然后我们试了下去掉全链路starter的引用,发明照旧400错误。然后再回退SpringBoot版本,发明是正常的。 综上:是由于进级了SpringBoot版本导致了该题目,又由于是http的头部变革导致的题目,故可以斗胆揣摩是由于进级了Tomcat版本导致的该题目。 tomcat版本从8.5.11进级到8.5.31 妨碍当地复现 由前面的说明可知,nginx在没有设置proxy_set_header HOST $host 的时辰,在转发http哀求的时辰会默认把upstream的名称作为Host头部的内容。 也就是说新版的tomcat在吸取Host为sc_java(带有下划线)的http哀求报了400错误。 下面我们来复现一下这个错误: 如下,当地陈设两个行使新版本tomcat的靠山处事,端口别离为8083和8084。 nginx设置如下。重点是upstream是带下划线的。 然后行使postman哀求nginx,复现400错误。 调解nginx设置,首要修改upstream为没有下划线的。 然后再哀求,发明是正常的。 妨碍修复方案
根因说明 我们固然知道了妨碍的缘故起因,也知道了怎么修复这个妨碍。可是就是不知道新版的tomcat为什么呈现这个题目。带着这个疑问,我们组的同事在SpringBoot项目标issue中搜刮了下400题目,发明晰实有相干的issue。 https://github.com/spring-projects/spring-boot/issues/13236 (编辑:河北网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |