注: 该篇是由于阅读一篇公众号文章看到升级tomcat会发生这个坑,这里记录下,以便在之后的工作中遇到这个坑时,很方便的解决这个问题。
参考地址:https://mp.weixin.qq.com/s/_orImnCJqQlOTvATPf0o-A

故障描述

tomcat版本从8.5.11升级到8.5.31后,线上nginx 报400错误,ng配置如下:

解决方法

  • 在nginx中的location下加了一行配置后就好了,proxy_set_header HOST $host
  • 这个配置的主要是在nginx在转发htp请求的时候会加上实际的Host请求头。如http请求是 http://abc.com/hello,那么nginx在转发http请求的时候会原封不动的把host请求头(Host:abc.com)转发给后台服务。对于nginx而言,如果没有配置proxy_set_header HOST $host的时候会默认修改Host为upstream的名称。

本地故障重现

  • nginx配置如下。重点是upstream是带下划线的
    然后使用postman请求nginx,复现400错误
  • 调整nginx配置,主要修改upstream为没有下划线的

    然后再请求,发现是正常的
  • 也就是说新版的tomcat在接收Host为fav_tomcat(带有下划线)的http请求报了400错误

根因分析

我们虽然知道了故障的原因,也知道了怎么修复这个故障。但是就是不知道新版的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的相关的bug
Improve logging in AbstractProcessor.parseHost()
下面是bug中的错误stack

发现对应的代码改动如下

到这里我们也就知道了处理Host头部的类就是这个HttpParser类。
然后我在本次check了下tomcat8.5.31 和8.5.11的代码,比对了一下HttpParser以及AbstractProcessor类。
对比结果如下:

发现8.5.31版本的AbstractProcessor类中多了一个parseHost的方法,然后主要解析方法是Host.parse(valueMB);

到这里我们就已经知道了为什么8.5.11版本的tomcat是正常的,主要是因为8.5.11版本的tomcat没有对Host头部进行校验,而在8.5.31版本的tomcat增加了该校验。

经验教训

好了,到这里我们就知道了,其实对于带有下划线的Host,tomcat是遵循的RFC1-1034的规范的,所以tomcat的处理是正确的。但是tomcat在处理某些其他合法的Host的时候历史上出现过bug,但是对于下划线的处理一直是正确的。所以,以后nginx在配置upstream的时候不能使用带有下划线的名称,还有最好在location位置上加上proxy_set_header HOST $host

升级tomcat遇到的坑相关推荐

  1. node升级命令_Laravel Mix 4升级说明与“排坑儿”指南

    本篇是我们系列课程<Laravel5.7优雅实战入门:第二版>和<Laravel 5.7&Vue 2.x深度整合实战:第二版>的扩展阅读. 想要更好的阅读体验,请观看原 ...

  2. 转:android.support升级到androidx踩坑记录

    原文链接:android.support升级到androidx踩坑记录 - 简书 年前想着Google老大之前提醒过将项目升级到androidx,所以年前一通操作猛如虎把Android Studio唰 ...

  3. Linux部署Tomcat踩的坑以及解决方案【8080无法访问、日志显示XX端口被占用、修改默认端口、无法提供安全连接】

    Linux部署Tomcat踩的坑以及解决方案[8080无法访问.日志显示XX端口被占用.修改默认端口.无法提供安全连接] 8080无法访问 解压开压缩包后,执行bin目录下的 startup.sh 后 ...

  4. 警惕参数变化,MySQL 8.0 升级避免再次踩坑

    MySQL 8.0新特性专栏目录 <MySQL开发规范>过时了,视图查询性能提升了一万倍 你真的会用EXPLAIN么,SQL性能优化王者晋级之路 索引三剑客之降序索引和不可见索引 千呼万唤 ...

  5. Mac 升级之 brew 踩坑

    事初: 在 Mac 环境下, 给 phpstorm 配置 xdebug 方法: brew install homebrew/php/php70-xdebug [快捷方式,不要问我为什么] 结果:    ...

  6. tomcat升级_「shell脚本」懒人运维之自动升级tomcat应用(war包)

    准备: 提前修改war包里的相关配置,并上传到服务器: 根据要自动升级的tomcat应用修改或添加脚本相关内容: tomcat启动脚本如是自己写的,要统一格式命名,如:xxx.xxxTomcat 等: ...

  7. 本地tomcat启动war包_「shell脚本」懒人运维之自动升级tomcat应用(war包)

    准备: 提前修改war包里的相关配置,并上传到服务器: 根据要自动升级的tomcat应用修改或添加脚本相关内容: tomcat启动脚本如是自己写的,要统一格式命名,如:xxx.xxxTomcat 等: ...

  8. 那些年 iOS 升级踩过的坑!

    作者 | 刘欣 责编 | 郭芮 每年iOS SDK的升级对于从事iOS开发的同学来说,犹如噩梦一般,因为每次升级都会带来大大小小的坑.相信每个iOS开发者都体会过其中的辛酸.今天和大家分享一下我的一个 ...

  9. 搭建MyEclipse和Tomcat遇到的坑(JavaEE作业)

    在前几天做选修课JavaEE的作业时,遇到一些坑,今天将他们记下来,既留作经验总结,也希望可以对以后看到的人有用! 采用的软件是老师提供的MyEclipse2015和Tomcat8.0 记得在安装To ...

  10. linux系统tomcat升级,Tomcat 7 升级到 Tomcat 8 历程

    总述 JDK都要出12了,而我们项目使用的jdk却仍然还停留在JDK1.6.为了追寻技术的发展的脚步,我这边准备将项目升级到JDK1.8.而作为一个web项目,我们的容器使用的是Tomcat.看了下T ...

最新文章

  1. [摘录]代码优化规则
  2. 《Adobe Photoshop CC经典教程(彩色版)》—第4课4.7节添加调整图层
  3. Unity-数学2-四元数
  4. 如何从一个 C# 的 dump 中挖到机器相关的信息?
  5. hadoop 依赖式job_Java项目中使用XXL-JOB调度框架
  6. 【CAS】Implementing generic double-word compare and swap for x86/x86-64
  7. windows共享关闭密码保护是灰色的
  8. 第七届蓝桥杯javaB组真题解析-抽签(第五题)
  9. 双系统linux引导修复
  10. 抖音超火的罗马时钟html代码,最近抖音上挺火的圆形文字时钟
  11. HTML表格表单案例
  12. excel 根据两点经纬度计算距离
  13. 最新服务器处理器天梯,服务器cpu天梯图2020
  14. CCF题目:相邻数对
  15. 计算机知识及保密培训目的,二勘院举办保密知识和计算机网络安全专题培训会...
  16. 03_使用scrapy框架爬取豆瓣电影TOP250
  17. 索尼Alpha系列相机通过照片读取快门次数的在线工具
  18. 台湾大学林轩田教授机器学习基石课程理解及python实现----PLA
  19. 第二章:第二三节数据重构
  20. c语言中错误为ffblk未定义,C - 错误没有定义和存储未知

热门文章

  1. eclipse 大小写快捷键_idea中的一些常用快捷键
  2. e盾服务端源码_学习ZooKeeper源码,就从这篇开始吧
  3. SQL:pgsql创建、查询、删除索引
  4. Cesium:地球中实现点击浮动弹窗
  5. matlab kfcm,聚类——KFCM的matlab程序
  6. tcp长连接java_聊聊 TCP 长连接和心跳那些事
  7. OpenCV_cv::Mat的深拷贝 浅拷贝问题
  8. 深度学习笔记_基本概念_卷积网络中的通道channel、特征图feature map、过滤器filter和卷积核kernel
  9. 编译原理文法等价变换
  10. ICCV2021 | 简单有效的长尾视觉识别新方案:蒸馏自监督(SSD)