記一次BUG解決
問題描述
近期用戶反映系統經常頁面加載不全,功能按鈕失效,需要多次刷新纔可用,失敗率極高,已經影響了用戶的使用,我們在本地使用卻沒有任何問題。後面跟蹤發現,部署在服務器上的應用我們訪問時,很多JS和資源文件會加載失敗,而且失敗概率較高,用戶的問題就是因爲缺少了JS文件和一些樣式文件導致的。
排查及解決
猜測一:是不是網絡原因?
因爲客戶使用的商密網,還是VPN,故網絡不穩定的情況時有發生。但是進一步分析,就算網絡較差,應該也只是加載較慢,不會直接加載失敗。
猜測二:是否資源文件的路徑不對?
因爲每次加載失敗的資源文件不固定,而且多次刷新之後就能成功了。所以這個可能性排除。
猜測三:Tomcat配置問題?
因爲在本地訪問是沒有問題的,而一放到服務器上就會出現這個問題,故懷疑是否tomcat的配置有問題,後面果然在tomcat裏面發現了一個奇怪的配置:
去掉這個keepAliveTimeout=0
的配置之後,BUG迎刃而解。
後續
後面查閱資料,keepAliveTimeout
這個字段是設置下次請求過來之前,持久連接保持的時間,如設置爲0,則保持時間爲0。這個參數如果不設置,則默認取connectionTimeout
這個參數的值。
持久連接(Keep-Alive)也叫做長連接,它是一種 TCP 的連接方式,連接會被瀏覽器和服務器所緩存,在下次連接同一服務器時,緩存的連接被重新使用。由於 HTTP 的無狀態性,人們也一直很清楚“一次性”的 HTTP 通信。持久連接則減少了創建連接的開銷,提高了性能。HTTP/1.1 已經支持長連接,大部分瀏覽器和服務器也提供了長連接的支持。
keepAliveTimeout:
表示在下次請求過來之前,tomcat保持該連接多久。這就是說假如客戶端不斷有請求過來,且未超過過期時間,則該連接將一直保持。
maxKeepAliveRequests:
表示該連接最大支持的請求數。超過該請求數的連接也將被關閉(此時就會返回一個Connection: close頭給客戶端)。