查看 Apigee Edge 說明文件。
前往
Apigee X說明文件。 資訊
問題
用戶端應用程式收到 HTTP 狀態碼 502 Bad Gateway
和錯誤代碼
protocol.http.TooBigLine
做為 API 呼叫的回應。
錯誤訊息
用戶端應用程式會取得下列回應代碼:
HTTP/1.1 502 Bad Gateway
此外,您也可能會看到下列錯誤訊息:
{ "fault":{ "faultstring":"response line size exceeding 2,048", "detail":{ "errorcode":"protocol.http.TooBigLine" } } }
可能原因
如果 Response-Line 大小由 將目標/後端伺服器連結到 Apigee 作為 HTTP 回應的邊緣大於允許的最大值 Apigee Edge 的相關限制。
在探討這項錯誤的可能原因前,我們先來看看什麼是回應行 以及如何檢查其大小
瞭解回應線
一般 HTTP 回應包含三個部分:
- 狀態列 (在 Apigee 中稱為 Response-Line)
- ( HTTP 標頭集合)
- [ 內文 ]
Response-Line 由三個部分組成:通訊協定版本後面接著 數字 狀態碼及其相關文字詞組,如下所示:
Response-Line = <HTTP-Version> <Status-Code> <Reason-Phrase>
當目標/後端伺服器應用程式送出 HTTP 回應時,第一行是
傳送代表的是上述的 Response-Line,後面接著
標頭和回應內文/酬載。下方的螢幕截圖顯示一般
curl
要求,Request 部分和 Response 部分 (以及
回應行)。
瞭解回應行大小
在上述範例中,回應中的 start 行 (第一行) 也會 Response-Line 如下所示:
HTTP/1.1 200 OK
這個回應行的大小為
~15 bytes
,因為其中包含15 ASCII characters
。由於此屬性位於 Apigee Edge 中允許的上限,系統會將回應傳回給用戶端, 發生錯誤- 同樣地,如果您查看
faultstring
錯誤訊息,其中包含"response line size exceeding 2,048"
。這表示 HTTP 回應中的 Response-Line 超過 2,048 個位元組
瞭解大型回應行
根據 狀態行 (稱為 Response-Line) 以及一般 HTTP 要求和 這個回應的大小將遠低於 Apigee Edge 中定義的預設上限 2 K。 因此我們可能不會 達到上限。但在某些情況下,可能會超過這項限制:
- 目標/後端伺服器不是 HTTP 系統。回應可能傳回非 HTTP 回應。
- 目標/後端伺服器發生問題,並傳送較長的 Response-Line 做為 HTTP 回應。
詳情請參閱 收到錯誤通訊協定.http.TooBigLine「回應行大小超過 2,048」。
以下是可能引發錯誤的可能原因:
原因 | 說明 | 適用的疑難排解操作說明 |
---|---|---|
回應行大小超過允許的上限 | 做為 對 Apigee Edge 的 HTTP 回應大於 在 Apigee Edge 中允許的數量上限 | 邊緣公有雲和私有雲使用者 |
常見的診斷步驟
請使用下列其中一項工具/技巧診斷這個錯誤:
API Monitoring
如何使用 API Monitoring 診斷錯誤:
- 以下列使用者身分登入 Apigee Edge UI: 擔任適當角色
切換到您要調查問題的機構。
- 前往「Analyze」(分析) >「API 監控 >調查頁面。
- 請選取您發現錯誤的確切時間範圍。
- 您可以選取「Proxy」篩選器來縮小錯誤程式碼的範圍。
- 根據「時間」繪製「Fault Code」指標。
選取含有錯誤程式碼
protocol.http.TooBigLine
的儲存格 如下所示:( 查看較大的圖片)
畫面上會顯示錯誤程式碼的相關資訊
protocol.http.TooBigLine
,如下所示:( 查看較大的圖片)
按一下「查看記錄」,然後展開失敗要求的資料列。
- 在「Logs」(記錄檔) 視窗中,記下下列詳細資料:
- 狀態碼:
502
- 錯誤來源:
target
- 錯誤代碼:
protocol.http.TooBigLine
。
- 狀態碼:
- 如果錯誤來源的值
target
和錯誤 Code 的值是protocol.http.TooBigLine
,就表示 來自目標/ 後端伺服器的 HTTP 回應的 Response-Line 大小大於 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 (訊息處理器元件) 將錯誤擲回 收到來自後端伺服器的回應 (因回應行的大小) 超過允許的上限
- 錯誤:
您會在傳送至用戶端的回應中 用戶端階段,如下所示:
( 查看較大的圖片)
- 請注意追蹤記錄中的錯誤值:
- 錯誤:
502 Bad Gateway
。 - 錯誤內容:
{"fault":{"faultstring":"response line exceeding 2,048","detail":{"errorcode":"protocol.http.TooBigLine"}}}
- 錯誤:
您也可以前往追蹤記錄的「AX」AX (已記錄的數據分析資料) 階段 然後按一下即可查看錯誤詳細資料。
( 查看較大的圖片)
請注意下列值:
要求標頭 值 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 未顯示任何
502
錯誤 比對protocol.http.TooBigLine
的值,然後 是 X-Apigee-fault-source. 的價值上述 NGINX 存取記錄的範例項目包含下列 X- Apigee-fault-code 和 X-Apigee-fault-source:
回應標頭 值 X-Apigee-fault-code protocol.http.TooBigLine
X-Apigee-fault-source target
原因:回應行大小超過允許的上限
診斷
- 針對使用 API 觀察到的錯誤判斷「錯誤程式碼」和「錯誤來源」 Monitoring、Trace 工具或 NGINX 存取記錄 常見的診斷步驟。
- 如果 Fault Source 的值為
target
,則表示 目標/後端伺服器應用程式傳送至 Apigee 的 Response-Line 大小大於 在 Apigee Edge 中允許限制。 您可以使用 1 行程式碼,驗證 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 的 Response-Line 大小。
訊息處理器記錄
如何使用訊息處理器記錄進行驗證:
如果您是 Private Cloud 使用者,可將訊息處理者的記錄檔用於 檢查 Response-Line 大小是否超過 在 Apigee Edge 中允許限制。
- 利用 API 監控、追蹤工具、追蹤工具 或 NGINX 存取記錄 (方法請見常見診斷步驟)。
在郵件處理器記錄中搜尋郵件 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 會擲回例外狀況,並傳回502
狀態碼 產生錯誤程式碼protocol.http.TooBigline
至用戶端應用程式
解析度
修正大小
選項 #1 [建議]:修正無法傳送目標/後端伺服器應用程式的問題 回應行的大小超過允許的上限
- 分析特定客戶的原因,以便傳送更多大小的回應行 超出限制中定義的允許上限。
- 如果不是,請修改目標/後端伺服器應用程式,使其 傳送的大小低於允許的上限。
- 如果您希望回應的話,而您想傳送大於 請前往下一個選項
CwC
方法 #2:使用 CwC 屬性提高回應行上限
Apigee 提供 CwC 屬性,以便增加回應行的大小限制。 詳情請參閱 設定訊息處理器的回應行限制。
限制
Apigee 預期用戶端應用程式和後端伺服器不會傳送要求/回應行 大小超出要求/回應行數限制所述的允許上限 在 Apigee Edge 限制中。
- 如果您是 Public Cloud 使用者,則要求與要求的上限 回應行大小如以下所示的 Request/Response-Line 大小: Apigee Edge 限制。
- 如果您是 Private Cloud 使用者 ,可能已修改預設上限 請求和回應行的大小限制 (即使並非建議做法)。 您可以按照 如何查看目前的限制。
如何查看目前的限制?
本節說明如何驗證 HTTPResponse.line.limit
資源
已透過訊息處理器上的新值進行更新。
- 在訊息處理器電腦上搜尋屬性
HTTPResponse.line.limit
是/opt/apigee/edge-message-processor/conf
目錄,然後查看 各設定的值如下所示:grep -ri "HTTPResponse.line.limit" /opt/apigee/edge-message-processor/conf
- 上述指令的結果範例如下:
/opt/apigee/edge-message-processor/conf/http.properties:HTTPResponse.line.limit=2k
請注意,在上方的輸出範例中,請注意屬性
HTTPResponse.line.limit
已在http.properties
中設為2k
。這表示在 Apigee 中為不公開狀態所設定的回應行大小限制 雲端為 2 KB。
如果仍需 Apigee 支援團隊的協助,請前往 必須收集診斷資訊。
必須收集診斷資訊
收集下列診斷資訊,然後與 Apigee Edge 支援團隊聯絡:
如果您是公有雲使用者,請提供下列資訊:
- 機構名稱
- 環境名稱
- API Proxy 名稱
- 完成用於重現
502
錯誤的 curl 指令 - API 要求的追蹤檔
如果您是 Private Cloud 使用者,請提供下列資訊:
- 偵測到失敗要求的完整錯誤訊息
- 機構名稱
- 環境名稱
- API Proxy 套裝組合
- 失敗 API 要求的追蹤檔
- 完成
curl
指令 (用來重現502
錯誤) 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