用了10多年的 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而言,假如没有设置proxysetheader HOST $host的时辰会默认修改Host为upstream的名称。 然后我们又在压测情形中试了一下修改之前的版本,发明是正常的。我们nginx的设置概略如下 那总结一下此刻的征象:
那我们到底修改了什么呢?
然后我们试了下去掉全链路starter的引用,发明照旧400错误。然后再回退SpringBoot版本,发明是正常的 综上:是由于进级了SpringBoot版本导致了该题目,又由于是http的头部变革导致的题目,故可以斗胆揣摩是由于进级了Tomcat版本导致的该题目。 tomcat版本从8.5.11进级到8.5.31 妨碍当地复现 由前面的说明可知,nginx在没有设置proxysetheader 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 [tomcat] Spring boot web always return 400 when use a domain name 固然看上去跟我们的题目是一样的,都是400题目,可是详细产生的缘故起因是纷歧样的。这个issue是说,假如domain name .ext 包括数字,好比 "domain.sf1m",会呈现400题目。这个题目也已经在tomcat的新版本中修复了。 可是纵然我行使最新的8.5.x版本的tomcat,用带有下划线的Host的http去哀求tomcat的时辰依然会报400错误。 也就是说,带有下划线的Host的http哀求,tomcat以为是有题目的 那为什么之前版本的tomcat是正常的呢?带着这个疑问我们来说明一下tomcat的源代码。 因为之前没有看过tomcat的源代码,以是要说明出到底是哪一行代码有题目是很坚苦的,以是我查察了下tomcat的相干的bugImprove logging in AbstractProcessor.parseHost() (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |