您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件。 資訊
問題
用戶端應用程式會取得 502 Bad Gateway
的 HTTP 狀態碼,以及錯誤代碼 protocol.http.TooBigLine
做為 API 呼叫的回應。
錯誤訊息
用戶端應用程式會取得以下回應代碼:
HTTP/1.1 502 Bad Gateway
此外,您可能會遇到以下錯誤訊息:
{ "fault":{ "faultstring":"response line size exceeding 2,048", "detail":{ "errorcode":"protocol.http.TooBigLine" } } }
可能原因
如果目標/後端伺服器 (即 HTTP 回應的一部分) 傳送至 Apigee Edge 的 Response-Line 大小大於 Apigee Edge 中的限制,就會發生這個錯誤。
查看這個錯誤的可能原因之前,我們先瞭解「回應行」代表的意義,以及如何查看其大小。
瞭解回應行
一般的 HTTP 回應由三個部分組成:
- 狀態行 (在 Apigee 中稱為 Response-Line)
- ( 一組 HTTP 標頭)
- [ 內文 ]
回應行包含三個部分:通訊協定版本後面加上數字狀態碼及其相關文字詞組,如下所示:
Response-Line = <HTTP-Version> <Status-Code> <Reason-Phrase>
當目標/後端伺服器應用程式傳送 HTTP 回應時,傳送的第一行代表上述的 Response-Line。後面接有標頭和回應主體/酬載。下列範例螢幕截圖顯示一般的 curl
要求、Request 部分、Response 部分 (以及 Response-Line)。
瞭解回應行大小
在上述的範例中,回應中的 start 行 (第一行) 也稱為「Response-Line」:
HTTP/1.1 200 OK
由於這個回應行包含
15 ASCII characters
,因此其大小為~15 bytes
。由於這個值未超過 Apigee Edge 允許的限制,因此 Apigee Edge 會將回應傳回用戶端,而且不會發生任何錯誤。- 同樣地,如果您查看上述錯誤訊息中的
faultstring
,則包含"response line size exceeding 2,048"
。這表示目標/後端伺服器傳送之 HTTP 回應中的 Response-Line 超過 2,048 個位元組。
瞭解大型回應行
根據 Status-Line (此處稱為 Response-Line) 和一般 HTTP 要求與回應的定義,其大小遠低於 Apigee Edge 中定義的預設上限 2 K,因此可能不會達到上限。不過,下列情形可能會超過這個限制:
- 目標/後端伺服器不是 HTTP 系統。可能會以非 HTTP 回應回應。
- 目標/後端伺服器發生問題,並做為 HTTP 回應的一部分傳送較長的回應行。
詳情請參閱 取得錯誤通訊協定.http.TooBigLine、「回應行大小超過 2,048」一節。
以下是發生錯誤的可能原因:
原因 | 說明 | 適用的疑難排解指示 |
---|---|---|
回應行大小超過系統允許的上限 | 目標/後端伺服器作為 Apigee Edge HTTP 回應的一部分傳送的 Response-Line 大小超過 Apigee Edge 中的限制 | Edge Public and Private Cloud 使用者 |
常見診斷步驟
請使用下列其中一種工具/技巧診斷這項錯誤:
API Monitoring
如何使用 API Monitoring 診斷錯誤:
- 以 適當角色的使用者 登入 Apigee Edge UI。
切換至您想要調查問題的機構。
- 前往「分析」>「API 監控」>「調查」頁面。
- 請選取你發現錯誤的特定時間範圍。
- 您可以選取「Proxy」篩選器來縮小錯誤代碼的範圍。
- 將「Fault Code」與「Time」進行比較。
選取含有錯誤代碼
protocol.http.TooBigLine
的儲存格,如下所示:( 查看較大圖片)。
系統會顯示錯誤代碼
protocol.http.TooBigLine
的相關資訊,如下所示:( 查看較大圖片)。
按一下「查看記錄」,然後展開失敗要求的資料列。
- 在「記錄檔」視窗中記下下列詳細資料:
- 狀態碼:
502
- Fault 資料來源:
target
- 錯誤代碼:
protocol.http.TooBigLine
。
- 狀態碼:
- 如果「Fault Source」的值為
target
,且「Fault Code」的值為protocol.http.TooBigLine
,則表示來自目標/ 後端伺服器的 HTTP 回應大小大於 Apigee Edge 中的上限上限。
追蹤工具
- 啟用追蹤工作階段,然後採取下列其中一種做法:
- 等待發生
502 Bad Gateway
錯誤。 - 如果可以重現問題,請發出 API 呼叫並重現
502 Bad Gateway
錯誤。
- 等待發生
- 請選取其中一個失敗的要求,然後檢查追蹤記錄。
- 瀏覽追蹤記錄的不同階段,找出發生錯誤的位置。
您通常會在「要求傳送至目標伺服器」階段之後的
flowinfo
「錯誤」階段看到錯誤,如下所示:記下追蹤記錄中的錯誤值:
- 錯誤:
response line exceeding 2,048
- error.class:
com.apigee.errors.http.server.BadGateway
這表示 Apigee Edge (訊息處理器元件) 因回應行大小超出允許的上限,而在收到後端伺服器的回應時立即擲回錯誤。
- 錯誤:
您會在「Response 已傳送至用戶端」階段中看到傳送至用戶端的錯誤訊息,如下所示:
( 查看較大圖片)。
- 記下追蹤記錄中的錯誤值:
- 錯誤:
502 Bad Gateway
。 - 錯誤內容:
{"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
- 錯誤:
您也可以前往追蹤記錄中的 AX (Analytics (分析) 已記錄) 階段,按一下該階段即可查看錯誤詳細資料。
( 查看較大圖片)。
請注意下列值:
要求標頭 值 X-Apigee-fault-code protocol.http.TooBigLine
X-Apigee-fault-source target
錯誤內容:內文 {"fault":{"faultstring":"response line size exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
NGINX
如何使用 NGINX 存取記錄檔診斷錯誤:
- 如果您是 Private Cloud 使用者,即可使用 NGINX 存取記錄檔來判斷 HTTP
502
錯誤的相關重要資訊。 查看 NGINX 存取記錄檔:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
其中:將 ORG、ENV 和 PORT# 替換為實際值。
- 搜尋特定時間範圍內是否有任何
502
錯誤 (如果問題過去發生),或是否有任何要求仍失敗並顯示502
。 如果在 X-Apigee-fault-code 與 X-Apigee-fault-code 的值相符的情況下發現任何
502
錯誤,請判斷 X-Apigee-fault-code 的值。以上 NGINX 存取記錄中的範例項目,針對 X- Apigee-fault-code 和 X-Apigee-fault-source 提供下列值:
回應標頭 值 X-Apigee-fault-code protocol.http.TooBigLine
X-Apigee-fault-source target
原因:回應行的大小超過允許的上限
診斷
- 使用 API 監控、追蹤工具或 NGINX 存取記錄檔,按照常見診斷步驟說明,找出錯誤的「Fault Code」和「Fault Source」。
- 如果「Fault Source」的值為
target
,表示目標/後端伺服器應用程式傳送至 Apigee 的 Response-Line 大小超過 Apigee Edge 中允許的限制。 您可以使用下列任一方法驗證 Response-Line 的大小是否超過 2 KB 的限制:
錯誤訊息
如何使用錯誤訊息進行驗證:
如果您可以存取 Apigee Edge 傳送的完整錯誤訊息,請參閱
faultstring
。錯誤訊息示例:
"faultstring":"response line size exceeding 2,048"
上述
faultstring
表示回應行的大小超過系統允許的上限 (2 KB)。實際要求
如何使用實際要求進行驗證:
如果您可以存取對目標/後端伺服器應用程式傳送的實際要求,請執行下列步驟:
- 確認回應行的大小
- 如果您發現 URI 大小超過 Apigee Edge 中的限制,就是問題原因。
目標/後端伺服器的回應範例:
curl -v http://HOSTALIAS/test
* Trying 3.2.1.4... * TCP_NODELAY set * Connected to <hostalias> (3.2.1.4) port 80 (#0) > GET /test HTTP/1.1 > Host: HOSTALIAS > User-Agent: curl/7.64.1 > Accept: */* > < HTTP/1.1 200 1111…<trimmed>...11111111 < Date: Mon, 26 Jul 2021 07:07:18 GMT < Content-Type: application/json < Content-Length: 269 < Connection: keep-alive < Server: gunicorn/19.9.0 < Access-Control-Allow-Origin: * < Access-Control-Allow-Credentials: true < { <Response Body> } * Connection #0 to host <hostalias> left intact * Closing connection 0
在上述範例中,回應行
HTTP/1.1 200 1111…<trimmed>...11111111
大於 2 KB,也就是超過 2 K ASCII 字元。如果您使用其他用戶端,可以查看用戶端記錄檔,並嘗試找出傳送至 Apigee Edge 的回應行大小。
訊息處理器記錄
如何使用訊息處理器記錄進行驗證:
如果您是 Private Cloud 使用者,可以使用訊息處理器記錄檔來驗證回應行大小是否超過 Apigee Edge 中的限制。
- 依據常見診斷步驟的說明,使用 API 監控、追蹤工具或 NGINX 存取記錄檔判斷失敗要求的訊息 ID。
在郵件處理器記錄中搜尋郵件 ID:
/opt/apigee/var/log/edge-message-processor/logs/system.log
您會看到
system.log
的幾行程式碼,內容類似:2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1 NIOThread@1 ERROR HTTP.CLIENT - HTTPClient$Context$3.onException() : ClientChannel[Connected: Remote:3.2.1.2:80 Local:192.168.205.251:44398]@20592 useCount=1 bytesRead=0 bytesWritten=201 age=144ms lastIO=0ms isOpen=true.onExceptionRead exception: {} com.apigee.errors.http.server.BadGateway: response line size exceeding 2,048 at <snipped> 2021-07-26 06:45:41,451 org:myorg env:prod api:testtoobigline rev:1 messageid:r-5110240-1 NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractResponseListener.onException() : AbstractResponseListener.onError (HTTPResponse@6a5d6c33, response line size exceeding 2,048)
上方錯誤訊息中的
message = response line size exceeding 2,048
文字表示「Response-Line」的大小超過 2 KB。因此,Apigee Edge 會擲回例外狀況,將含有錯誤代碼protocol.http.TooBigline
的502
狀態碼傳回至用戶端應用程式。
解析度
固定大小
選項 #1 [建議]:修正目標/後端伺服器應用程式,不要傳送大小超過允許限制的 Response-Lines
- 分析特定用戶端傳送大小超過「限制」中允許限制的回應原因。
- 如果無法採用,請修改目標/後端伺服器應用程式,使其傳送小於允許限制的 Response-Line。
- 如需要傳送超過允許限制的 Response-Line,請前往下一個選項。
CwC
選項 #2:使用 CwC 屬性提高回覆行數量上限
Apigee 提供 CwC 屬性,可讓您提高回應行的大小限制。詳情請參閱 設定訊息處理器的回應行限制。
限制
Apigee 預期用戶端應用程式和後端伺服器不會傳送大小超出 Apigee 邊緣限制中「要求/回應行限制」限制的 Request/Response-Lines。
- 如果您是公開雲端使用者,則要求和回應行大小上限請參閱 Apigee Edge 限制中的 Request/Response-Line 大小上限。
- 如果您是私有雲使用者 ,您可能已修改要求和回應行大小的預設上限 (即便這不是建議做法)。如要決定回應行的大小上限,請按照如何查看目前限制中的指示操作。
如何查看目前的限制?
本節說明如何確認訊息處理器中的 HTTPResponse.line.limit
屬性已更新為新值。
- 在訊息處理器機器中,在
/opt/apigee/edge-message-processor/conf
目錄中搜尋HTTPResponse.line.limit
屬性,並查看以下設定值:grep -ri "HTTPResponse.line.limit" /opt/apigee/edge-message-processor/conf
- 上述指令的結果範例如下:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.line.limit=2k
請注意,在上述輸出範例中,請注意
http.properties
中的HTTPResponse.line.limit
屬性已設為2k
值。這表示在適用於私有雲的 Apigee 中,設定的回應行大小限制為 2 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