您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件。 資訊
問題
用戶端應用程式會取得 502 Bad Gateway
的 HTTP 狀態碼,以及錯誤代碼 protocol.http.TooBigHeaders
做為 API 呼叫的回應。
錯誤訊息
用戶端應用程式會取得以下回應代碼:
HTTP/1.1 502 Bad Gateway
此外,您可能會遇到以下錯誤訊息:
{ "fault":{ "faultstring":"response headers size exceeding 25,600", "detail":{ "errorcode":"protocol.http.TooBigHeaders" } } }
可能原因
如果目標/後端伺服器透過 HTTP 回應傳送至 Apigee Edge 的標頭總大小超過系統允許的 Apigee Edge 限制,就會發生這個錯誤。
這項錯誤的可能原因如下:
原因 | 說明 | 適用的疑難排解指示 |
---|---|---|
回應中的標頭大小超過允許的上限 | 目標/後端伺服器當做 Apigee Edge 的一部分 HTTP 回應中,特定標頭的標頭大小或所有標頭大小總和,超過 Apigee Edge 中允許的限制。 | Edge Public and Private Cloud 使用者 |
常見診斷步驟
請使用下列其中一種工具/技巧診斷這項錯誤:
API Monitoring
如何使用 API Monitoring 診斷錯誤:
- 以 適當角色的使用者 登入 Apigee Edge UI。
切換至您想要調查問題的機構。
- 前往「分析」>「API 監控」>「調查」頁面。
- 請選取你發現錯誤的特定時間範圍。
- 您可以選取「Proxy」篩選器來縮小錯誤代碼的範圍。
- 將「Fault Code」與「Time」進行比較。
選取含有錯誤代碼
protocol.http.TooBigHeaders
的儲存格,如下所示:( 查看較大圖片)。
系統會顯示錯誤代碼
protocol.http.TooBigHeaders
的相關資訊,如下所示:( 查看較大圖片)。
按一下「查看記錄」,然後展開失敗要求的資料列。
( 查看較大圖片)。
- 在「記錄檔」視窗中記下下列詳細資料:
- 狀態碼:
502
- Fault 資料來源:
target
- 錯誤代碼:
protocol.http.TooBigHeaders
。
- 狀態碼:
- 如果「Fault Source」的值為
target
,且「Fault Code」的值為protocol.http.TooBigHeaders
,則表示來自目標/ 後端伺服器的 HTTP 回應具有大小大於 Apigee Edge 中允許的限制。
追蹤工具
- 啟用追蹤工作階段,然後採取下列其中一種做法:
- 等待發生
502 Bad Gateway
錯誤,或 - 如果可以重現問題,請發出 API 呼叫並重現
502 Bad Gateway
錯誤。
- 等待發生
- 請選取其中一個失敗的要求,然後檢查追蹤記錄。
- 瀏覽追蹤記錄的不同階段,找出發生錯誤的位置。
通常在「要求傳送至目標伺服器」階段之後,名為 Error 的流程中會顯示這個錯誤,如下所示:
( 查看較大圖片)。
記下追蹤記錄中的錯誤值:
- 錯誤:
response headers size exceeding 25,600
- error.class:
com.apigee.errors.http.server.BadGateway
這表示 Apigee Edge (訊息處理器元件) 因標頭大小超過允許的限制,而收到後端伺服器的回應時,會立即擲回錯誤。
- 錯誤:
Apigee Edge 傳送的「Response Sent to Client」錯誤回應會顯示失敗,如下所示:
( 查看較大圖片)。
- 記下追蹤記錄中的錯誤值。上述追蹤記錄範例顯示:
- 錯誤:
502 Bad Gateway
。 - 錯誤內容:
{"fault":{"faultstring":"response headers size exceeding 25,600","detail":{"errorcode":"protocol.http.TooBigHeaders"}}}
- 錯誤:
前往追蹤記錄中的「AX」(Analytics (分析) 已記錄) 階段,點選即可查看相關詳細資料。
( 查看較大圖片)。
請注意下列值:
錯誤標頭 值 X-Apigee-fault-code protocol.http.TooBigHeaders
X-Apigee-fault-source target
錯誤內容:內文 {"fault":{"faultstring":"response headers size exceeding 25,600","detail":{"errorcode":"protocol.http.TooBigHeaders"}}}
NGINX
如何使用 NGINX 存取記錄檔診斷錯誤:
- 如果您是 Private Cloud 使用者,則可以使用 NGINX 存取記錄檔來判斷 HTTP
502 Bad Gateway
的重要資訊。 查看 NGINX 存取記錄檔:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
其中:將 ORG、ENV 和 PORT# 替換為實際值。
- 搜尋特定期間內 (問題過去是否發生),或是否有任何要求仍為
502
失敗,且錯誤代碼為protocol.http.TooBigHeaders
。502
如果在 X-Apigee-fault-code 與 X-Apigee-fault-code 的值相符的情況下發現任何
502
錯誤,請判斷 X-Apigee-fault-code 的值。NGINX 存取記錄中的 502 錯誤示例:
以上 NGINX 存取記錄中的範例項目,有下列「X-Apigee-fault-code」X-Apigee-fault-code 和「X-Apigee-fault-source」X-Apigee-fault-code 的值:
錯誤標頭 值 X-Apigee-fault-code protocol.http.TooBigHeaders
X-Apigee-fault-source target
原因:回應中的標頭大小大於允許的限制
診斷
- 按照常見診斷步驟所述,針對透過 API 監控、追蹤記錄工具或 NGINX 存取記錄找出錯誤的「Fault Code」、「Fault 來源」和「回應酬載大小」。
- 如果「Fault Source」的值為
target
,表示目標/後端伺服器傳送至 Apigee 的回應具有標頭,其大小大於 Apigee Edge 中允許的限制。 - 您可以使用下列任一方法,驗證目標/後端的回應是否含有大小超過允許限制的標頭:
錯誤訊息
如何使用錯誤訊息進行驗證:
如果您可以存取從 Apigee Edge 收到的完整錯誤訊息,請參閱
faultstring
。faultstring
表示回應標頭大小超出允許的上限。錯誤訊息示例:
"faultstring":"response headers size exceeding 25,600"
在上述錯誤訊息中,請注意,在
faultstring
中,回應的標頭總大小超過允許的上限。實際要求
如何使用實際要求進行驗證:
如果您可以存取對目標/後端伺服器傳送的實際要求,請執行下列步驟:
- 如果您是公開雲端/私有雲使用者,請從後端伺服器本身,或是您允許向後端伺服器發出要求的其他機器,直接向後端伺服器發出要求。
- 如果您是 Private Cloud 使用者,也可以從其中一個訊息處理器向後端伺服器發出要求。
- 檢查從後端伺服器接收的回應,並明確計算及驗證回應中傳遞的標頭總大小。
如果您發現回應酬載中的標頭大小超過 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
這表示總標頭大小超過 25 KB,且當大小開始超出限制 25 KB 且含有錯誤代碼時,Apigee 會擲回錯誤
protocol.http.TooBigHeaders
解析度
固定大小
選項 #1 [建議]:修正目標伺服器應用程式,避免傳送標頭大小超過 Apigee 限制
- 分析特定目標伺服器傳送回應標頭大小超過「限制」中定義的允許上限的原因。
- 如果不想使用,請修改後端伺服器應用程式,使其傳送大小小於 Apigee Edge 中允許的限制的回應標頭。
- 檢查標頭資訊是否可當做回應主體的一部分傳送。
- 如果可行,請將您打算傳送的任何大型資訊,當做回應主體的標頭的一部分。這可確保您不會超過回應標頭限制。
CwC
選項 #2:使用 CwC 屬性增加回應標頭大小上限
Apigee 提供 CwC 屬性,可讓您提高回應標頭大小限制。 詳情請參閱 設定訊息處理器的限制
限制
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 中為私有雲設定的回應酬載大小限制為 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