記錄一次莫名奇妙的跨域502(badgateway)錯誤

這里圖片加載不了,原文請訪問:原文鏈接

公司的項目,這幾天添加了一個統計功能, 本地測試沒太大問題,上線后有一個問題,具體現象描述如下:

  • 統計首頁接口大約有5-6個,也就是同時需要訪問6個接口拿首頁數據
  • 這些接口瀏覽器訪問會隨機的,偶爾的出現跨域錯誤,提示CROS。但偶爾又能全部正常訪問
  • 本地測試沒有問題CROS問題

基于以上描述,首先想到可能nginx會有問題,因為線上和測試環境就只加了一層轉發。而測試環境沒有這個問題, 于是直接暴露線上服務端口訪問,故障依舊。

這里沒太想明白為啥是cros錯誤,對比了下options請求響應,都是正常請求響應的,響應數據也是正確的。所以這個問題暫記下

但是本地啟動為什么沒有CROS問題呢,看了下線上啟動腳本,線上啟動有添加堆大小限制的啟動命令(限制為512MB)。本地同步添加,果然問題就在本地復現了。

訪問瀏覽器提示跨域時,服務后臺日志如下:

14:50:41.003 [http-nio-8985-exec-60] ERROR o.a.c.h.Http11NioProtocol - [log,175] - Failed to complete processing of a request
java.lang.OutOfMemoryError: Java heap space
14:50:41.210 [http-nio-8985-exec-58] ERROR o.a.c.h.Http11NioProtocol - [log,175] - Failed to complete processing of a request
java.lang.OutOfMemoryError: Java heap space
14:50:41.211 [http-nio-8985-exec-60] ERROR o.a.t.u.n.NioEndpoint - [log,175] - Error running socket processor
java.lang.NullPointerException: Cannot invoke "java.nio.ByteBuffer.limit(int)" because "this.byteBuffer" is nullat org.apache.coyote.http11.Http11InputBuffer.recycle(Http11InputBuffer.java:262)at org.apache.coyote.http11.Http11Processor.recycle(Http11Processor.java:1418)at org.apache.coyote.AbstractProtocol$ConnectionHandler.release(AbstractProtocol.java:1085)at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:1060)at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744)at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)at java.base/java.lang.Thread.run(Thread.java:842)
14:50:41.211 [http-nio-8985-exec-58] ERROR o.a.t.u.n.NioEndpoint - [log,175] - Error running socket processor
java.lang.NullPointerException: Cannot invoke "java.nio.ByteBuffer.limit(int)" because "this.byteBuffer" is nullat org.apache.coyote.http11.Http11InputBuffer.recycle(Http11InputBuffer.java:262)at org.apache.coyote.http11.Http11Processor.recycle(Http11Processor.java:1418)at org.apache.coyote.AbstractProtocol$ConnectionHandler.release(AbstractProtocol.java:1085)at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:1060)at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744)at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)at java.base/java.lang.Thread.run(Thread.java:842)

堆溢出,我擦。第一時間想的就是哪里內存泄漏了? 導出堆空間,分析下內存。 這里可以看到有一個對象堆占用特別多

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

接下來看下堆中各個對象占用情況:
外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

這里可以看到 bytes 數組占用太大,有點不正常。 繼續跟進去看看誰在引用這些數組。
外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

把這個字節數組導出來,看看是寫什么。 這里面只有http請求頭,而且后面很多都是空。 大小125MB.
外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

繼續跟蹤字節數組被誰持有
外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

這里可以看到字節數組被一個http11InputBuffer對象的inputBuffer持有, 而inputBuffer里面headerBufferSize屬性,這個屬性值等于131072000 也就是前面的 125MB

這個headerbuffer怎么這么大啊,谷歌搜索下,這個buffer是用來裝http請求的header數據內容,也就是說http每次請求就需要申請125MB的空間,怪不得請求會報堆棧溢出。

再看了下文章,這個屬性可以通過 max-http-request-header-size 屬性進行配置。

所以接下來就簡單了,項目中搜索這個配置。有人配置為:max-http-request-header-size: 131072000 換算下來 1GB。 我的天

這也太大了,調整為10MB吧。 重啟項目,問題消失。

結語就是,繞了一大圈,這個跨域錯誤居然是內存泄漏,這個提示真的有方向性誤導啊。哈哈

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87504.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87504.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87504.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux之線程

Linux之線程 線程之形線程接口線程安全互斥鎖條件變量&信號量生產者與消費者模型線程池 線程之形 進程是資源分配的基本單位,而線程是進程內部的一個執行單元,也是 CPU 調度的基本單位。 線程之間共享進程地址空間、文件描述符與信號處理&#xff0…

snail-job的oracle sql(oracle 11g)

官網版本的oracle sql中有自增主鍵,oracle 11g并不支持,所以改成新建索引和觸發器的方式自增主鍵。(tip:snail-job的最新版本1.0.0必須使用JDK17, jdk8會報錯,所以最后沒用起來) /*SnailJob Dat…

Windows VMWare Centos Docker部署Nginx并配置對Springboot應用的訪問代理

前置博文 Windows VMWare Centos環境下安裝Docker并配置MySqlhttps://blog.csdn.net/u013224722/article/details/148928081 Windows VMWare Centos Docker部署Springboot應用https://blog.csdn.net/u013224722/article/details/148958480 # 將已存在的容器設置為宿主機重啟后…

暑期數據結構第一天

暑期數據結構第一天 數據元素與數據對象 數據元素--組成數據的基本單位 與數據的關系:是集合的個體 數據對象--性質相同的數據元素的集合 與數據的關系:集合的子集 邏輯結構 (1)線性結構,所有結點都最多有一個直…

vsCode 擴展中 package.nls.json 文件的作用國際化支持

package.nls.json 代表英文語言文件 {"command.favourite.addtofavourite": "Add to Favourite","command.favourite.deletefavourite": "Remove from Favourite","command.favourite.moveup": "Move Up" } 在 …

結構型智能科技的關鍵可行性——信息型智能向結構型智能的轉換(提綱)

結構型智能科技的關鍵可行性 ——信息型智能向結構型智能的轉換 1.信息型智能科技概述 1.1傳統計算機科技的信息型繼承者 1.2 信息型智能環境 1.3信息型智能主體 1.4機器學習創造的智能 1.5信息型智能科技的問題 2.結構型智能科技概述 2.1傳統計算機科技向真實生命結構…

Excel 數據合并助手SheetDataMerge智能識別同類數據,銷售報表處理提升效率

各位Excel小能手們!今天給大家介紹個超厲害的玩意兒——SheetDataMerge,這可是專注Excel數據處理的實用工具!它就像個數據小管家,核心功能就是智能合并工作表里的同類數據。 軟件下載地址安裝包 它有多牛呢?能自動識別…

AIStarter平臺使用指南:如何一鍵卸載已下載的AI項目(最新版操作教程)

如果你正在使用 AIStarter 平臺,但不知道如何卸載不再需要的 AI 項目,那么這篇簡明教程將為你提供清晰的操作指引。 AIStarter 是由知名創作者“熊哥”打造的一款 AI 工具啟動器平臺,旨在幫助用戶快速部署和運行各類 AI 項目。隨著平臺不斷更…

項目中大表治理方案實踐

一、業務背景 目前生產庫數據庫服務器數據存儲達到了13T,其中license_spart表數據量達到了200億,占用7.5T,空間占用率達到54%。而且這張表每年數據增長量達到30億。其中有效VALID數據占20億,無效數據INVALID占180億。由于業務上有…

快應用(QuickApp)技術解析與UniApp跨端開發生態探秘優雅草卓伊凡

快應用(QuickApp)技術解析與UniApp跨端開發生態探秘優雅草卓伊凡引言:一場由快應用引發的技術辯論近日,優雅草科技的資深開發者卓伊凡在與甲方的一次項目溝通中,因技術選型問題展開了激烈討論。甲方對快應用&#xff0…

《Font Awesome 參考手冊》

《Font Awesome 參考手冊》 引言 Font Awesome 是一個功能豐富的圖標庫,旨在幫助設計師和開發者快速地在網頁上添加圖標。它提供了超過700個矢量圖標,并且支持響應式設計。本文將為您詳細介紹 Font Awesome 的使用方法、圖標分類、圖標定制以及與 CSS 的結合。 一、Font A…

Linux基本命令篇 —— uname命令

uname命令是Linux系統中用于顯示系統信息的實用工具,它可以提供關于操作系統、內核版本、硬件架構等重要信息。下面我將詳細介紹這個命令的用法和常見應用場景。 目錄 一、基本語法 二、常用選項 三、使用示例 顯示所有系統信息(最常用) …

React Native 開發環境搭建--window--android

官網: https://reactnative.cn/docs/environment-setup 必須安裝的 node, JDK ,android Studio 安裝node 以前裝了nvm, 用nvm install 18.0.0 就可以了 安裝JDK 1、下載 ---- 我安裝的是11 【JAVA17下載傳送門】 注意!!!1 …

ODS 系統是什么?企業為什么需要搭建 ODS?

目錄 一、ODS 系統基礎認知:先弄明白它是啥 1. 什么是 ODS 系統? 2. ODS 系統的起源 3. ODS 系統的特點 二、ODS 系統能干啥?核心功能解析 1. 數據集成 2. 數據清洗和轉換 3. 實時數據更新 4. 數據查詢和分析 三、企業為什么非得搭…

通過網頁調用身份證閱讀器http websocket方法-華視電子————仙盟創夢IDE

1.安裝全瀏覽器網頁專用監控軟件 2.安裝后 3.配置web接口 4.測試讀取 5.驅動監控地址 時間段內讀取身份證:如超時時間10000ms,則在點擊按鈕10秒內,放上身份證就可以讀成功,超時返回失敗; 讀身份證:把身份證放上去后點擊讀卡,讀成功,再次讀卡需要將身份證拿起來再放回去; 不拿…

Spring Cloud 前端調用后端接口方式

在 Spring Cloud 微服務架構中,前端調用后端接口通常不直接通過 Eureka,而是通過以下兩種核心方式實現: 一、前端直接調用后端服務(需解決跨域和地址管理問題) 1. AJAX 直接調用 前端通過 HTTP 請求(如 …

【stm32】HAL庫開發——CubeMX配置RTC,單片機工作模式和看門狗

目錄 一、CubeMX配置RTC 1.RTC實時重要一環——BKP 寄存器 2.RTC實時時鐘 2.1打開RTC并設置時間 2.2打開外部低速時鐘 2.3代碼實現: 二、單片機工作模式 1.低功耗睡眠模式(Sleep) 2.低功耗停止模式(Stop) 3.低功耗待機模式(StandBy) 三、看門狗 1.獨立看…

9.Docker的容器數據卷使用(掛載)

什么是容器數據卷技術? 到這里,我算是入門docker了! docker的理念:將環境和應用打包成一個鏡像!直接安裝就能使用 如果數據都在容器中,那么我們一旦將容器刪除,數據就會丟失!因為…

使用 TCollector 寫入 TDengine

TCollector 是 openTSDB 的一部分,它用來采集客戶端日志發送給數據庫。 只需要將 TCollector 的配置修改指向運行 taosAdapter 的服務器域名(或 IP 地址)和相應端口即可將 TCollector 采集的數據存在到 TDengine 中,可以充分利用…

高斯消元法詳解

文章目錄 概念用法特殊情況 我的奇怪方法 概念 什么是高斯消元?讓我們看一看 OI-Wiki 的解釋: 高斯消元法(Gauss–Jordan elimination)是求解線性方程組的經典算法,它在當代數學中有著重要的地位和價值,是線性代數課…