您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件。 info
問題
用戶端應用程式會收到 HTTP 狀態碼 502 Bad Gateway,以及錯誤代碼 protocol.http.TooBigHeaders ,做為 API 呼叫的回應。
錯誤訊息
用戶端應用程式會取得下列回應代碼:
HTTP/1.1 502 Bad Gateway
此外,您可能會看到下列錯誤訊息:
{
"fault":{
"faultstring":"response headers size exceeding 25,600",
"detail":{
"errorcode":"protocol.http.TooBigHeaders"
}
}
}可能原因
如果目標/後端伺服器傳送至 Apigee Edge 的標頭總大小 (屬於 HTTP 回應的一部分) 大於 Apigee Edge 允許的上限,就會發生這個錯誤。
這項錯誤的可能原因如下:
| 原因 | 說明 | 適用於以下裝置的疑難排解說明 |
|---|---|---|
| 回應中的標頭大小超過允許的上限 | 特定標頭的標頭大小,或目標/後端伺服器在 HTTP 回應中傳送至 Apigee Edge 的所有標頭標頭大小總和,超過 Apigee Edge 允許的上限。 | Edge 公有和私有雲使用者 |
常見的診斷步驟
請使用下列其中一種工具/技術診斷這項錯誤:
API Monitoring
如要使用 API 監控功能診斷錯誤,請按照下列步驟操作:
- 以具備 適當角色的使用者身分登入 Apigee Edge UI。
切換至要調查問題的機構。
- 依序前往「Analyze」>「API Monitoring」>「Investigate」頁面。
- 選取您觀察到錯誤的特定時間範圍。
- 您可以選取「Proxy」篩選器,縮小故障代碼範圍。
- 繪製「錯誤代碼」與「時間」的關係圖。
選取含有故障代碼
protocol.http.TooBigHeaders的儲存格,如下所示:( 查看較大圖片)
您會看到故障代碼的相關資訊,如下所示:
protocol.http.TooBigHeaders( 查看較大圖片)
按一下「查看記錄」,然後展開失敗要求所在的資料列。
( 查看較大圖片)
- 在「記錄」視窗中,記下下列詳細資料:
- 狀態碼:
502 - 錯誤來源:
target - 故障代碼:
protocol.http.TooBigHeaders。
- 狀態碼:
- 如果「Fault Source」的值為
target,且「Fault Code」的值為protocol.http.TooBigHeaders,表示目標/ 後端伺服器的 HTTP 回應標頭大小超出 Apigee Edge 允許的限制。
追蹤工具
- 啟用追蹤工作階段
和下列任一項目:
- 等待發生
502 Bad Gateway錯誤,或 - 如果可以重現問題,請發出 API 呼叫並重現
502 Bad Gateway錯誤。
- 等待發生
- 選取其中一個失敗的要求,然後檢查追蹤記錄。
- 瀏覽追蹤記錄的不同階段,找出發生失敗的位置。
通常在「Request sent to target server」(已將要求傳送至目標伺服器) 階段後,您會在名為「Error」(錯誤) 的流程中看到這項錯誤,如下所示:
( 查看較大圖片)
請注意追蹤記錄中的錯誤值:
- 錯誤:
response headers size exceeding 25,600 - error.class:
com.apigee.errors.http.server.BadGateway
這表示 Apigee Edge (訊息處理器元件) 收到後端伺服器的回應後,會立即擲回錯誤,因為標頭大小超過允許的上限。
- 錯誤:
您會在「Response Sent to Client」(傳送至用戶端的回應) 中看到失敗,如下所示:
( 查看較大圖片)
- 請記下追蹤記錄中的錯誤值。上述追蹤記錄樣本顯示:
- 錯誤:
502 Bad Gateway。 - 錯誤內容:
{"fault":{"faultstring":"response headers size exceeding 25,600","detail":{"errorcode":"protocol.http.TooBigHeaders"}}}
- 錯誤:
前往追蹤記錄中的「AX」(記錄的 Analytics 資料) AX階段,然後點選該階段,查看相關詳細資料。
( 查看較大圖片)
請記下下列值:
錯誤標頭 值 X-Apigee-fault-code protocol.http.TooBigHeadersX-Apigee-fault-source target錯誤內容:內文 {"fault":{"faultstring":"response headers size exceeding 25,600","detail":{"errorcode":"protocol.http.TooBigHeaders"}}}
NGINX
如要使用 NGINX 存取記錄診斷錯誤,請按照下列步驟操作:
- 如果您是私有雲使用者,可以透過 NGINX 存取記錄判斷 HTTP
502 Bad Gateway的金鑰資訊。 檢查 NGINX 存取記錄:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log說明: ORG、ENV 和 PORT# 會替換為實際值。
- 搜尋特定時間內 (如果問題發生在過去) 是否有錯誤代碼為
protocol.http.TooBigHeaders的502錯誤,或是否有任何要求仍失敗並顯示502。 如果發現任何
502錯誤,且 X-Apigee-fault-code 與protocol.http.TooBigHeaders的值相符,請判斷 X-Apigee-fault-source 的值。NGINX 存取記錄檔中的 502 錯誤範例:
上述 NGINX 存取記錄檔的範例項目具有下列 X-Apigee-fault-code 和 X-Apigee-fault-source 值:
錯誤標頭 值 X-Apigee-fault-code protocol.http.TooBigHeadersX-Apigee-fault-source target
原因:回應中的標頭大小超過允許的上限
診斷
- 使用 API 監控、追蹤工具或 NGINX 存取記錄,判斷觀察到的錯誤的錯誤代碼、錯誤來源和回應酬載大小,如常見診斷步驟所述。
- 如果「Fault Source」(錯誤來源) 的值為
target,表示目標/後端伺服器傳送給 Apigee 的回應標頭大小,超過 Apigee Edge 允許的限制。 - 如要驗證目標/後端的回應標頭大小是否超過允許的上限,請使用下列其中一種方法:
錯誤訊息
如何使用錯誤訊息進行驗證:
如果您可以存取 Apigee Edge 傳送的完整錯誤訊息,請參閱
faultstring。faultstring表示回應標頭大小超過允許的上限。錯誤訊息範例:
"faultstring":"response headers size exceeding 25,600"
在上述錯誤訊息中,請注意
faultstring,回應的標頭總大小超過允許的上限。實際要求
如要使用實際要求進行驗證,請按照下列步驟操作:
如果您可以存取傳送至目標/後端伺服器的實際要求,請執行下列步驟:
- 如果您是公有雲/私有雲使用者,請直接從後端伺服器本身,或您獲准向後端伺服器提出要求的任何其他機器,向後端伺服器提出要求。
- 如果您是私有雲使用者,也可以從其中一個訊息處理器向後端伺服器提出要求。
- 檢查從後端伺服器收到的回應,並特別計算及驗證回應中傳遞的標頭總大小。
如果發現回應酬載中的標頭大小超過 Apigee Edge 允許的上限,這就是問題的原因。
目標伺服器的範例回應:
curl -v https://TARGET_SERVER_HOST/test
* About to connect() to 10.1.0.10 port 9000 (#0) * Trying 10.1.0.10... * Connected to 10.1.0.10 (10.1.0.10) port 9000 (#0) > GET /test HTTP/1.1 > User-Agent: curl/7.29.0 > Host: 10.1.0.10:9000 > Accept: */* < < HTTP/1.1 200 OK < Accept-Ranges: bytes < Content-Length: 0 < Content-Type: text/plain; charset=utf-8 < Last-Modified: Tue, 20 Jul 2021 09:23:56 GMT
< Testheader1: XVlBzgba—-<snipped>---THctcuAx < Testheader2: hxKQFDaFpLSj—-<snipped>---FbcXoEFfRsWxP< Date: Fri, 23 Jul 2021 09:51:22 GMT < * Connection #0 to host 10.1.0.10 left intact在上述範例中,
Testheader1和Testheader2的大小較大,因此超過 Apigee Edge 允許的限制,導致發生這個錯誤。
訊息處理器記錄
如要使用訊息處理器記錄進行驗證:
如果您是 Private Cloud 使用者,可以透過訊息處理器記錄,驗證回應標頭大小是否超出 Apigee Edge 允許的限制。
檢查訊息處理器記錄:
/opt/apigee/var/log/edge-message-processor/logs/system.log- 搜尋特定時間範圍內是否有任何
502錯誤 (如果問題發生在過去),或是否有任何要求仍失敗並顯示502。您可以使用下列搜尋字串:grep -ri "response headers size exceeding"
- 您會看到類似下列內容的
system.log行。 在您的情況下,回應標頭大小可能有所不同:2021-07-23 08:25:12,307 org:myorg env:prod api:bigheadertest rev:1 messageid:r23ijb1b-1 NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() : ClientChannel[Connected: Remote:3.7.1.1:9000 Local:192.168.2.1:56098]@8414 useCount=1 bytesRead=0 bytesWritten=207 age=640ms lastIO=0ms isOpen=true.onExceptionRead exception: {} com.apigee.errors.http.server.BadGateway: response headers size exceeding 25,600 2021-07-23 08:25:12,307 org:myorg env:prod api:bigheadertest rev:1 messageid:r23ijb1b-1 NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() : AbstractResponseListener.onError (HTTPResponse@31f3ef88, response headers size exceeding 25,600)
-
訊息處理器從後端/目標伺服器取得回應後,如果發現標頭總大小超過 25 KB,就會停止並擲回錯誤:
response headers size exceeding 25,600這表示「Total Header Size」超過 25 KB,且 Apigee 在大小開始超過 25 KB 上限時,會擲回錯誤,錯誤代碼為
protocol.http.TooBigHeaders。
解析度
修正大小
選項 1 (建議):修正目標伺服器應用程式,避免傳送超過 Apigee 限制的標頭大小
- 分析特定目標伺服器傳送的回應標頭大小超過「限制」中定義上限的原因。
- 如果不希望發生這種情況,請修改後端伺服器應用程式,使其傳送大小小於 Apigee Edge 允許上限的回應標頭。
- 確認標頭資訊是否可做為回應主體的一部分傳送。
- 如有可能,請將原本打算在標頭中傳送的任何大型資訊,改為在回覆內文中傳送。確保您不會超出回應標頭限制。
CwC
方法 2:使用 CwC 屬性提高回應標頭大小限制
Apigee 提供 CwC 屬性,可提高回應標頭大小上限。 詳情請參閱「 設定 Message Processor 的限制」。
限制
Apigee 預期用戶端應用程式和後端伺服器不會傳送超過允許上限的標頭大小,如 Apigee Edge 限制中「要求/回應標頭大小」一節所述。
- 如果您是公有雲使用者,要求和回應標頭大小上限與 Apigee Edge 限制中要求/回應標頭大小的規定相同。
- 如果您是私有雲使用者 ,可能已修改要求和回應標頭大小的預設上限 (即使不建議這麼做)。如要判斷回應標頭大小上限,請按照「如何查看目前上限」一文中的操作說明進行。
如何查看目前的限制?
本節說明如何確認訊息處理器上的屬性 HTTPResponse.headers.limit 已更新為新值。
- 在訊息處理器電腦上,搜尋
/opt/apigee/edge-message-processor/conf目錄中的HTTPResponse.headers.limit屬性,然後檢查已設定的值,如下所示:grep -ri "HTTPResponse.headers.limit" /opt/apigee/edge-message-processor/conf
- 上述指令的範例結果如下:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.headers.limit=25k
在上述輸出範例中,請注意屬性
HTTPResponse.headers.limit已在http.properties中設為25k值。這表示在 Apigee for Private Cloud 中設定的回應酬載大小上限為 25 KB。
如果仍需要 Apigee 支援團隊協助,請參閱「必須收集診斷資訊」。
必須收集診斷資訊
收集下列診斷資訊,然後聯絡 Apigee Edge 支援團隊:
如果您是公有雲使用者,請提供下列資訊:
- 機構名稱
- 環境名稱
- API Proxy 名稱
- 用於重現
502錯誤的完整curl指令 - API 要求的追蹤記錄檔
- 目標/後端伺服器回應的完整輸出內容,以及標頭大小
如果您是 Private Cloud 使用者,請提供下列資訊:
- 失敗要求顯示的完整錯誤訊息
- 機構名稱
- 環境名稱
- API Proxy 套裝組合
- 失敗 API 要求的追蹤記錄檔
- 用於重現
502錯誤的完整curl指令 - 目標/後端伺服器回應的完整輸出內容,以及標頭大小
NGINX 存取記錄
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log說明: ORG、ENV 和 PORT# 會替換為實際值。
- 訊息處理器系統記錄
/opt/apigee/var/log/edge-message-processor/logs/system.log