新版腾讯分分彩走势图 | 財經 | 資源 | 理財 | 考研 | 職場 | 論文 | 資格 | 股票學院 |

股票學院: 股票入門 - 股票知識 - 股票術語 - 炒股技巧 - 選股技巧 - 跟莊技巧 - 炒股經驗 - 投資策略 - K線圖 - 均線 - 分時圖 - 成交量 - 波浪理論 - 基本面分析 - 心理分析 - 漲停研究 - 趨勢線 - 江恩理論 - MACD - KDJ - 技術指標 - 財經股票書籍在線閱讀 - 金融類書籍下載 - 銀行學院 - 保險學院 - 外匯學院 - 債券學院 - 股票學院 - 基金學院 - 港股學院 - 黃金學院

當前位置:新版腾讯分分彩走势图 > 金融云 > 文章正文

快3门户网:用了10多年的 Tomcat 居然有bug,這能忍?

時間:2019-08-09 23:19:36來源:Java編程精選作者:佚名

    新版腾讯分分彩走势图 www.atbwx.com 為了解決分布式鏈路追蹤的問題,我們引入了實現OpenTracing的Jaeger來實現。然后我們為SpringBoot框架寫了一個starter以讓用戶實現近零改造接入全鏈路。

    由于公司有一個封裝了SpringBoot的內部框架,然后我們的starter就以最新框架所使用的SpringBoot版本為基礎進行開發。所以業務系統在接入的時候需要先升級框架,然后再引入我們的starter才行無縫接入全鏈路。

    用了10多年的 Tomcat 居然有bug,這能忍?

    故障描述

    然后有一個業務系統就按照步驟,升級框架,引入starter就接入了全鏈路系統,并且功能測試壓力測試都已經通過了。結果我們滿懷信心地就上線了。結果,線上nginx報大量http 400錯誤。

    故障排查

    出現故障后,業務系統的研發人員查了所有的日志,包括elk以及機器上的日志,都沒有發現明顯的錯誤日志。這個就。。。

    幾番掙扎后還是沒有在線上的日志中找到任何蛛絲馬跡。這個就比較絕望了。更奇怪的是在測試環境中是正常的,這個就比較詭異了。

    然后我們猜想是不是之前壓力測試做得不夠啊,我們還是在壓測環境中再壓測一下看看會不會復現。然后正好之前這個業務系統做過壓測,那就趕緊找運維搭建一個壓測環境。結果剛搭建完就非常給面子地復現了400錯誤。

    然后運維同學就各種折騰,然后神奇般地在nginx中的location下加了一行配置后就好了.

    1. proxy_set_header HOST $host 

    然后就開始各種查這個配置是啥意思。

    這個配置的主要是在nginx在轉發htp請求的時候會加上實際的Host請求頭。如http請求是 //abc.com/hello,那么nginx在轉發http請求的時候會原封不動的把host請求頭(Host:abc.com)轉發給后臺服務。對于nginx而言,如果沒有配置proxysetheader HOST $host的時候會默認修改Host為upstream的名稱。

    然后我們又在壓測環境中試了一下修改之前的版本,發現是正常的。我們nginx的配置大體如下

    用了10多年的 Tomcat 居然有bug,這能忍?

    那總結一下現在的現象:

    • 在nginx沒有配置proxysetheader HOST $host的時候,修改之前的版本是正常的,修改之后的版本報400錯誤
    • 在nginx配置了proxysetheader HOST $host之后,兩個版本都是正常的

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

    • 升級SpringBoot的版本
    • 引入全鏈路starter

    然后我們試了下去掉全鏈路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

    用了10多年的 Tomcat 居然有bug,這能忍?

    nginx配置如下。重點是upstream是帶下劃線的

    用了10多年的 Tomcat 居然有bug,這能忍?

    然后使用postman請求nginx,復現400錯誤

    用了10多年的 Tomcat 居然有bug,這能忍?

    調整nginx配置,主要修改upstream為沒有下劃線的

    用了10多年的 Tomcat 居然有bug,這能忍?

    然后再請求,發現是正常的

    用了10多年的 Tomcat 居然有bug,這能忍?

    故障修復方案

    • 回退tomcat版本。代價較大
    • 線上修改nginx配置:加上配置proxysetheader HOST $host 或者修改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()

    相關閱讀

    焦點圖文

    關于我們 | 廣告服務 | 商務合作 | 網站地圖

    版權所有 Copyright(C)2018-2020 蘇州騏云躍網絡科技有限公司,未經授權禁止復制或建立鏡像,否則將依法追究法律責任!
    聲明:我們不做任何形式的代客理財及投資指導,凡是以天下金融網名義做股票推薦的行為均屬違法!
    廣告商的言論與行為均與天下金融網無關!股市有風險,投資需謹慎。
    蘇公網安備 32050502000166號
    蘇ICP備14018528號
    商務合作:新版腾讯分分彩走势图

    天下金融網版權所有