加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

Tomcat竟然有bug,这我能信?

发布时间:2019-06-15 06:46:57 所属栏目:业界 来源:简书
导读:配景先容 为了办理漫衍式链路追踪的题目,我们引入了实现OpenTracing的Jaeger来实现。然后我们为SpringBoot框架写了一个starter以让用户实现近零改革接入全链路。 因为公司有一个封装了SpringBoot的内部框架,然后我们的starter就以最新框架所行使的Spring
副问题[/!--empirenews.page--]

配景先容

为了办理漫衍式链路追踪的题目,我们引入了实现OpenTracing的Jaeger来实现。然后我们为SpringBoot框架写了一个starter以让用户实现近零改革接入全链路。

因为公司有一个封装了SpringBoot的内部框架,然后我们的starter就以最新框架所行使的SpringBoot版本为基本举办开拓。以是营业体系在接入的时辰必要先辈级框架,然后再引入我们的starter才行无缝接入全链路。

Tomcat竟然有bug,这我能信?

妨碍描写

然后有一个营业体系就凭证步调,进级框架,引入starter就接入了全链路体系,而且成果测试压力测试都已经通过了。功效我们满怀信念地就上线了。功效,线上nginx报大量http 400错误。

Tomcat竟然有bug,这我能信?

妨碍排查

呈现妨碍后,营业体系的研发职员查了全部的日记,包罗elk以及呆板上的日记,都没有发显着显的错误日记。这个就。。。

Tomcat竟然有bug,这我能信?

几番挣扎后照旧没有在线上的日记中找到任何蛛丝马迹。这个就较量绝望了。更稀疏的是在测试情形中是正常的,这个就较量诡异了。

然后我们意料是不是之前压力测试做得不足啊,我们照旧在压测情形中再压测一下看看会不会复现。然后正好之前这个营业体系做过压测,那就赶忙找运维搭建一个压测情形。功效刚搭建完就很是给体面地复现了400错误。

然后运维同窗就各类折腾,然后神奇般地在nginx中的location下加了一行设置后就好了。

  1. proxy_set_header HOST $host 

Tomcat竟然有bug,这我能信?

然后就开始各类查这个设置是啥意思。

这个设置的首要是在nginx在转发htp哀求的时辰会加上现实的Host哀求头。如http哀求是 http://abc.com/hello,那么nginx在转发http哀求的时辰会原封不动的把host哀求头(Host:abc.com)转发给靠山处事。对付nginx而言,假如没有设置proxy_set_header HOST $host的时辰会默认修改Host为upstream的名称。

然后我们又在压测情形中试了一下修改之前的版本,发明是正常的。

我们nginx的设置概略如下:

Tomcat竟然有bug,这我能信?

那总结一下此刻的征象:

  • 在nginx没有设置proxy_set_header HOST $host的时辰,修改之前的版本是正常的,修改之后的版本报400错误。
  • 在nginx设置了proxy_set_header HOST $host之后,两个版本都是正常的。

那我们到底修改了什么呢?

  • 进级SpringBoot的版本
  • 引入全链路starter

然后我们试了下去掉全链路starter的引用,发明照旧400错误。然后再回退SpringBoot版本,发明是正常的。

综上:是由于进级了SpringBoot版本导致了该题目,又由于是http的头部变革导致的题目,故可以斗胆揣摩是由于进级了Tomcat版本导致的该题目。

tomcat版本从8.5.11进级到8.5.31

Tomcat竟然有bug,这我能信?

妨碍当地复现

由前面的说明可知,nginx在没有设置proxy_set_header HOST $host 的时辰,在转发http哀求的时辰会默认把upstream的名称作为Host头部的内容。

也就是说新版的tomcat在吸取Host为sc_java(带有下划线)的http哀求报了400错误。

下面我们来复现一下这个错误:

如下,当地陈设两个行使新版本tomcat的靠山处事,端口别离为8083和8084。

Tomcat竟然有bug,这我能信?

nginx设置如下。重点是upstream是带下划线的。

Tomcat竟然有bug,这我能信?

然后行使postman哀求nginx,复现400错误。

Tomcat竟然有bug,这我能信?

调解nginx设置,首要修改upstream为没有下划线的。

Tomcat竟然有bug,这我能信?

然后再哀求,发明是正常的。

Tomcat竟然有bug,这我能信?

妨碍修复方案

  • 回退tomcat版本。价钱较大。
  • 线上修改nginx设置:加上设置proxy_set_header HOST $host 可能修改upstream为没有下划线的名称

根因说明

我们固然知道了妨碍的缘故起因,也知道了怎么修复这个妨碍。可是就是不知道新版的tomcat为什么呈现这个题目。带着这个疑问,我们组的同事在SpringBoot项目标issue中搜刮了下400题目,发明晰实有相干的issue。

https://github.com/spring-projects/spring-boot/issues/13236

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读