查看 Apigee Edge 說明文件。
前往
Apigee X說明文件。 資訊
問題
用戶端應用程式收到 HTTP 狀態碼 502 Bad Gateway
,錯誤訊息
將程式碼設為 protocol.http.ResponseWithBody
做為 API 呼叫的回應。
錯誤訊息
用戶端應用程式會取得下列回應代碼:
HTTP/1.1 502 Bad Gateway
此外,您也可能會看到下列其中一則錯誤訊息:
{ "fault":{ "faultstring":"Received 204 Response with message body", "detail":{ "errorcode":"protocol.http.ResponseWithBody" } } }
{ "fault":{ "faultstring":"Received 205 Response with message body", "detail":{ "errorcode":"protocol.http.ResponseWithBody" } } }
可能原因
如果從後端伺服器到 Apigee Edge 的 HTTP 回應
204 No Content
或 205 Reset Content
,但包含 回應
body 和/或下列一或多個標頭:
Content-Length
Content-Encoding
Transfer-Encoding
根據規格
RFC 7231,6.3.5 節:204 No Content,和
RFC 7231,6.3.6 節:205 重設內容,預期沒有其他內容
應做為回應酬載主體的一部分,傳回狀態碼 204 No
Content
或 205 Reset Content
。回應標頭
例如 Content-Length
、Content-Encoding
或
Transfer-Encoding
表示回應酬載的大小、類型或格式。
因此,Apigee Edge 會傳回 502 Bad Gateway
狀態碼:
根據下列程式碼 protocol.http.ResponseWithBody
傳回錯誤代碼
情況:
後端伺服器的狀態碼 | ||
---|---|---|
來自後端伺服器的回應包含 | 204 沒有內容 | 205 重設內容 |
回應主體 | 錯誤 | 錯誤 |
(設為非零) |
錯誤 | 錯誤 |
(設為 Apigee Edge 支援的編碼) |
錯誤 | 沒有錯誤 |
Transfer-Encoding |
錯誤 | 錯誤 |
以下是導致這個錯誤的可能原因:
原因 | 說明 | 適用的疑難排解操作說明 |
---|---|---|
來自後端伺服器傳回 204 回應的回應主體或標頭 | 後端伺服器傳送 204 No Content 或 205 Reset Content
這個回應含有回應主體和/或一或多個標頭 Content-Type 。
Content-Encoding 或 Transfer-Encoding 。 |
邊緣公有雲和私有雲使用者 |
常見的診斷步驟
請使用下列其中一項工具/技巧診斷這個錯誤:
API Monitoring
如何使用 API Monitoring 診斷錯誤:
- 以下列使用者身分登入 Apigee Edge UI: 擔任適當角色
切換到您要調查問題的機構。
- 前往「Analyze」(分析) >「API 監控 >調查頁面。
- 請選取您發現錯誤的確切時間範圍。
- 根據「時間」繪製「Fault Code」指標。
選取含有錯誤程式碼
protocol.http.ResponseWithBody
的儲存格 如下所示:( 查看較大的圖片)
畫面上會顯示錯誤程式碼的相關資訊
protocol.http.ResponseWithBody
,如下所示:( 查看較大的圖片)
按一下「查看記錄」,然後展開失敗要求的資料列。
( 查看較大的圖片)
- 在「Logs」(記錄檔) 視窗中,記下下列詳細資料:
- 狀態碼:
502
- 錯誤來源:
target
- 錯誤代碼:
protocol.http.ResponseWithBody
。
- 狀態碼:
- 如果錯誤來源的值
target
和錯誤 程式碼的值為protocol.http.ResponseWithBody
,則 表示發生錯誤,因為後端伺服器204 No Content
或205 Reset Content
狀態碼,其中包含 回應內文和/或 可能原因一節。
追蹤工具
如何使用追蹤工具診斷錯誤:
- 啟用追蹤工作階段
和下列其中一項:
- 等待
502 Bad Gateway
錯誤發生。或 - 如果可以重現問題,請發出 API 呼叫,並重現
502 Bad Gateway
錯誤。
- 等待
確保已啟用「Show all FlowInfos」:
- 請選取其中一個失敗的要求,然後檢查追蹤記錄。
- 瀏覽追蹤記錄的各個階段,找出失敗之處 發生。
錯誤通常會出現在
flowinfo
「錯誤」中 「傳送至目標伺服器的要求」階段結束後,如下所示:情境 1
情境 #1:後端伺服器傳回狀態碼為
204 No Content
包含回應主體和/或 可能原因。請留意追蹤記錄中的下列值:
- 錯誤:
Received 204 Response with message body
- error.class:
com.apigee.rest.framework.BadGateway
情境 2
情境 #2:後端伺服器傳回狀態碼
204 No Content
包含回應主體和/或 列於可能原因中的標頭。請留意追蹤記錄中的下列值:
- 錯誤:
Received 205 Response with message body
- error.class:
com.apigee.rest.framework.BadGateway
- 錯誤:
- 前往追蹤記錄中的「AX」AX(已記錄的 Analytics 資料) 階段 然後按一下
向下捲動至「Phase Details」、「Error Headers」部分,然後 確定 X-Apigee-fault-code 和 X-Apigee-fault-source 的值 如下所示:
( 查看較大的圖片)
- 請注意,X-Apigee-fault-code 和 X-Apigee-fault-source 的值
are protocol.http.ResponseWithBody
和target
。 這表示發生錯誤是因為後端伺服器204 No Content
或205 Reset Content
狀態碼 回應內文和/或「可能原因」中提及的任一標頭。錯誤 值 X-Apigee-fault-code protocol.http.ResponseWithBody
X-Apigee-fault-source target
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.ResponseWithBody
(如果問題是過去發生) 或者502
。 如果發現任何含有 X-Apigee-fault-code 的
502
錯誤 與protocol.http.ResponseWithBody
的值相符,然後判斷 X-Apigee-fault-source 的值。NGINX 存取記錄中的 502 錯誤示例:
上述 NGINX 存取記錄的範例項目包含下列 X- Apigee-fault-code 和 X-Apigee-fault-source:
回應標頭 值 X-Apigee-fault-code protocol.http.ResponseWithBody
X-Apigee-fault-source target
- 請注意,X-Apigee-fault-code 和 X-Apigee-fault-source 的值
分別為
protocol.http.ResponseWithBody
和target
。 這表示發生錯誤是因為後端伺服器204 No Content
或205 Reset Content
狀態碼 回應內文和/或「可能原因」中提及的任一標頭。
原因:後端伺服器傳回 204 回應的回應主體或標頭
診斷
- 針對使用 API 觀察到的錯誤判斷「錯誤程式碼」和「錯誤來源」 Monitoring、Trace 工具或 NGINX 存取記錄 常見的診斷步驟。
- 如果「Fault Code」為
protocol.http.ResponseWithBody
,且 Fault Source 的值為target
,表示後端 伺服器回應了204 No Content
或205 Reset Content
狀態 回應內文和/或上述任一標頭 可能原因。 驗證後端伺服器是否確實傳送了回應酬載主體和/或 或「可能原因」一節中提及的一或多個標頭,您可以 請執行下列步驟:
如果您是公用雲端使用者,而且是否可以向 或直接存取後端伺服器
- 如果您是 Private Cloud 使用者,可以向 或與特定 Deployment 關聯的同一則訊息 發現故障的組織和環境
查看從後端伺服器收到的回應,並確認其中包含 回應酬載主體和/或上述一或多個標頭。如果是, 發生這項錯誤的原因
範例 #1
範例 1:含有 Content-Encoding 標頭的後端伺服器回應 204
curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
… < HTTP/1.1 204 No Content
< Content-Encoding: gzip
< Date: Tue, 31 Jul 2021 21:41:13 GMT < Connection: keep-alive在此範例中,後端伺服器以
204 No Content
狀態碼和Content-Encoding: gzip
範例 #2
範例 #2:含有 Content-Length 標頭的後端伺服器回應 204
curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
… < HTTP/1.1 204 No Content
< Content-Length: 48
< Date: Tue, 31 Jul 2021 21:41:13 GMT < Connection: keep-alive在此範例中,後端伺服器以
204 No Content
狀態碼和Content-Length: 48
範例 #3
範例 #3:含有回應主體的後端伺服器回應 205
curl -v "https://BACKEND_SERVER_HOST_NAME/PATH" -H "HEADER: VALUE" -X HTTP_REQUEST_METHOD
… < HTTP/1.1 205 Reset Content < Date: Sat, 31 Jul 2021 17:14:09 GMT < Content-Length: 12 < Content-Type: text/plain; charset=utf-8 < * Connection #0 to host X.X.X.X left intact
This is a sample Response
在此範例中,後端伺服器以 含有回應主體的
205 Reset Content
狀態碼This is a sample Response.
- 在上述所有範例中,後端伺服器傳送了
204 No Content
或 包含回應主體和/或其中一個標頭的205 Reset Content
狀態碼 一文中提到的「可能原因」一節。 - 因此,Apigee Edge 傳送了
502 Bad Gateway
狀態碼及錯誤代碼protocol.http.ResponseWithBody
。
解析度
確保後端伺服器一律遵循規格要求
RFC 7231,6.3.6 節:205 重設內容 (在傳送 204 No Content
時
或 205 Reset Content
回應 Apigee Edge也就是說
請勿以 204 No Content
或
205 Reset Content
回應:
- 回應酬載主體
- 以及下列任一標題:
Content-Length
Content-Encoding
Transfer-Encoding
規格
Apigee Edge 會以 502 Bad Gateway
狀態碼和錯誤代碼回應
protocol.http.ResponseWithBody
如果後端伺服器
204 No Content
或 205 Reset Content
回應,但
不符合下列 RFC 規格:
規格 |
---|
RFC 7231,6.3.5 節:204 No Content |
RFC 7231,6.3.6 節:205 重設內容 |
要點
建議的解決方案是修正後端伺服器,以傳送 204 No Content
和 205 Reset Content
狀態碼,其中沒有回應主體和
標題 - Content-Length
、Content-Encoding
和
Transfer-Encoding
,並遵循規格要求
RFC 7231,6.3.5 節:204 No Content,以及
RFC 7231,6.3.6 節:205 重設內容。
如果仍需 Apigee 支援團隊的協助,請前往 必須收集診斷資訊。
必須收集診斷資訊
收集下列診斷資訊,然後與 Apigee Edge 支援團隊聯絡:
如果您是公有雲使用者,請提供下列資訊:
- 機構名稱
- 環境名稱
- API Proxy 名稱
- 完成
curl
指令 (用來重現502
錯誤) - API 要求的追蹤檔
如果您是 Private Cloud 使用者,請提供下列資訊:
- 偵測到失敗要求的完整錯誤訊息
- 環境名稱
- API Proxy 套裝組合
- API 要求的追蹤檔
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