您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件。 資訊
問題
用戶端應用程式會取得 502 Bad Gateway
的 HTTP 狀態碼,以及錯誤代碼 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
,但其中包含回應主體和/或下列一或多個標頭,就會發生這個錯誤:
Content-Length
Content-Encoding
Transfer-Encoding
根據
RFC 7231,6.3.5 節:204 無內容和
RFC 7231 第 6.3.6 節:205 重設內容的規格,原始伺服器應該不會在回應酬載主體中傳送狀態碼 204 No
Content
或 205 Reset Content
。Content-Length
、Content-Encoding
或 Transfer-Encoding
等回應標頭會指出回應酬載的大小、類型或格式。
因此,在下列情況下,Apigee Edge 會將含有錯誤代碼 protocol.http.ResponseWithBody
的 502 Bad Gateway
狀態碼傳回用戶端:
後端伺服器的狀態碼 | ||
---|---|---|
後端伺服器的回應包含 | 204 沒有內容 | 205 重設內容 |
回應主體 | 錯誤 | 錯誤 |
(設為非零) |
錯誤 | 錯誤 |
(設為 Apigee Edge 中支援的編碼) |
錯誤 | 沒有錯誤 |
Transfer-Encoding |
錯誤 | 錯誤 |
這項錯誤的可能原因如下:
原因 | 說明 | 適用的疑難排解指示 |
---|---|---|
含有來自後端伺服器 204 回應的回應主體或標頭 | 後端伺服器會傳送 204 No Content 或 205 Reset Content 回應,其中包含回應主體和/或一或多個標頭 Content-Type 、Content-Encoding 或 Transfer-Encoding 。 |
Edge Public and Private Cloud 使用者 |
常見診斷步驟
請使用下列其中一種工具/技巧診斷這項錯誤:
API Monitoring
如何使用 API Monitoring 診斷錯誤:
- 以 適當角色的使用者 登入 Apigee Edge UI。
切換至您想要調查問題的機構。
- 前往「分析」>「API 監控」>「調查」頁面。
- 請選取你發現錯誤的特定時間範圍。
- 將「Fault Code」與「Time」進行比較。
選取含有錯誤代碼
protocol.http.ResponseWithBody
的儲存格,如下所示:( 查看較大圖片)。
系統會顯示錯誤代碼
protocol.http.ResponseWithBody
的相關資訊,如下所示:( 查看較大圖片)。
按一下「查看記錄」,然後展開失敗要求的資料列。
( 查看較大圖片)。
- 在「記錄檔」視窗中記下下列詳細資料:
- 狀態碼:
502
- Fault 資料來源:
target
- 錯誤代碼:
protocol.http.ResponseWithBody
。
- 狀態碼:
- 如果「Fault Source」的值為
target
,且「Fault Code」的值為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」(Analytics (分析) 資料記錄) 階段,然後按一下該階段。
向下捲動至「階段詳細資料」、「錯誤標頭」區段,確定 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
,502
和錯誤代碼protocol.http.ResponseWithBody
。 如果在 X-Apigee-fault-code 中發現符合
protocol.http.ResponseWithBody
值的任何502
錯誤,請判斷 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 監控、追蹤工具或 NGINX 存取記錄檔,按照常見診斷步驟的說明,找出錯誤的「Fault Code」和「Fault Source」。
- 如果「Fault Code」為
protocol.http.ResponseWithBody
,且「Fault Source」的值為target
,則表示後端伺服器回應了204 No Content
或205 Reset Content
狀態碼,且回應內文和/或可能原因中提及的其中一個標頭。 如要驗證後端伺服器是否確實傳送了回應酬載主體和/或「可能原因」一節所述的一或多個標頭,您可以執行下列步驟:
如果您是公用雲端使用者,而且能夠直接從任何系統向後端伺服器提出相同的 API 要求,
- 如果您是私人 Cloud 使用者,可以直接透過觀察到特定機構和環境的相關訊息處理者,向後端伺服器發出相同的 API 要求。
檢查從後端伺服器收到的回應,並確認其中含有回應酬載主體,以及/或上述一或多個標頭。如果有,這就是這個錯誤的原因。
範例 #1
範例 #1:後端伺服器回應 204 (含 Content-Encoding 標頭)
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:後端伺服器回應 204 (含 Content-Length 標頭)
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
的錯誤代碼。
解析度
確保將 204 No Content
或 205 Reset Content
回應傳送至 Apigee Edge 時,確保後端伺服器一律符合
RFC 7231 規範 6.3.6: 205 重設內容的規定。也就是說,後端伺服器「不得」在 204 No Content
或 205 Reset Content
回應中傳送下列內容:
- 回應酬載主體
- 以及下列任何標頭:
Content-Length
Content-Encoding
Transfer-Encoding
規格
如果後端伺服器傳送 204 No Content
或 205 Reset Content
回應,但不符合以下 RFC 規範,Apigee Edge 會傳回 502 Bad Gateway
狀態碼和錯誤代碼 protocol.http.ResponseWithBody
:
規格 |
---|
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 無內容和
6.3.6 節:重設內容。
如果仍需要 Apigee 支援團隊的任何協助,請參閱「必須收集診斷資訊」。
必須收集診斷資訊
收集下列診斷資訊,然後與 Apigee Edge 支援團隊聯絡:
如果您是公開雲端使用者,請提供下列資訊:
- 機構組織名稱
- 環境名稱
- API Proxy 名稱
- 完成用來重現
502
錯誤的curl
指令 - 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