您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件。 info
問題
用戶端應用程式會收到 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,但包含回應主體和/或下列一或多個標頭,就會發生這項錯誤:
Content-LengthContent-EncodingTransfer-Encoding
根據規格
RFC 7231 第 6.3.5 節:204 No Content 和
RFC 7231 第 6.3.6 節:205 Reset Content,原始伺服器不應在回應酬載主體中傳送任何額外內容,並使用狀態碼 204 No
Content 或 205 Reset Content。回應標頭 (例如 Content-Length、Content-Encoding 或 Transfer-Encoding) 會指出回應酬載的大小、類型或格式。
因此,在下列情況下,Apigee Edge 會向用戶端傳回 502 Bad Gateway 狀態碼和錯誤碼 protocol.http.ResponseWithBody:
| 後端伺服器的狀態碼 | ||
|---|---|---|
| 後端伺服器的回應包含 | 204 沒有內容 | 205 Reset Content |
| 回應主體 | 錯誤 | 錯誤 |
(設為非零值) |
錯誤 | 錯誤 |
(設為 Apigee Edge 支援的編碼) |
錯誤 | 無錯誤 |
Transfer-Encoding |
錯誤 | 錯誤 |
這項錯誤的可能原因如下:
| 原因 | 說明 | 適用於以下裝置的疑難排解說明 |
|---|---|---|
| 後端伺服器傳回 204 回應,但回應內文或標頭包含內容 | 後端伺服器會傳送 204 No Content 或 205 Reset Content 回應,其中包含回應內文和/或一或多個標頭 Content-Type、Content-Encoding 或 Transfer-Encoding。 |
Edge 公有和私有雲使用者 |
常見的診斷步驟
請使用下列其中一種工具/技術診斷這項錯誤:
API Monitoring
如要使用 API 監控功能診斷錯誤,請按照下列步驟操作:
- 以具備 適當角色的使用者身分登入 Apigee Edge UI。
切換至要調查問題的機構。
- 依序前往「Analyze」>「API Monitoring」>「Investigate」頁面。
- 選取您觀察到錯誤的特定時間範圍。
- 繪製「錯誤碼」與「時間」的關係圖。
選取含有故障代碼
protocol.http.ResponseWithBody的儲存格,如下所示:( 查看較大圖片)
您會看到故障代碼的相關資訊,如下所示:
protocol.http.ResponseWithBody( 查看較大圖片)
按一下「查看記錄」,然後展開失敗要求所在的資料列。
( 查看較大圖片)
- 在「記錄」視窗中,記下下列詳細資料:
- 狀態碼:
502 - 錯誤來源:
target - 故障代碼:
protocol.http.ResponseWithBody。
- 狀態碼:
- 如果「Fault Source」的值為
target,且「Fault Code」的值為protocol.http.ResponseWithBody,則表示發生錯誤的原因是後端伺服器傳送了204 No Content或205 Reset Content狀態碼,以及回應主體和/或「Possible causes」一節中提及的其中一個標頭。
追蹤工具
如要使用「追蹤」工具診斷錯誤,請按照下列步驟操作:
- 啟用追蹤工作階段
和下列任一項目:
- 等待發生
502 Bad Gateway錯誤。或 - 如果可以重現問題,請發出 API 呼叫並重現
502 Bad Gateway錯誤。
- 等待發生
確認已啟用「顯示所有流程資訊」:
- 選取其中一個失敗的要求,然後檢查追蹤記錄。
- 瀏覽追蹤記錄的不同階段,找出發生失敗的位置。
通常在「Request sent to target server」(已將要求傳送至目標伺服器) 階段之後,您就會在
flowinfo「Error」(錯誤) 中看到錯誤,如下所示:情境 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 資料) 階段,然後按一下該階段。AX
向下捲動至「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.ResponseWithBodyX-Apigee-fault-source target
NGINX
如要使用 NGINX 存取記錄診斷錯誤,請按照下列步驟操作:
- 如果您是私有雲使用者,可以透過 NGINX 存取記錄判斷 HTTP
502 Bad Gateway的金鑰資訊。 檢查 NGINX 存取記錄:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log說明: ORG、ENV 和 PORT# 會替換為實際值。
- 搜尋
protocol.http.ResponseWithBody特定時間內 (如果問題發生在過去) 是否有任何錯誤代碼為502的錯誤,或是否有任何要求仍失敗並顯示502。 如果發現任何
502錯誤,且 X-Apigee-fault-code 與protocol.http.ResponseWithBody的值相符,請判斷 X-Apigee-fault-source 的值。NGINX 存取記錄檔中的 502 錯誤範例:
上述 NGINX 存取記錄檔的範例項目,X-Apigee-fault-code 和 X-Apigee-fault-source 的值如下:
回應標頭 值 X-Apigee-fault-code protocol.http.ResponseWithBodyX-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」為
protocol.http.ResponseWithBody,且「Fault Source」的值為target,表示後端伺服器已傳回204 No Content或205 Reset Content狀態碼,並包含回應主體和/或「可能原因」中提及的其中一個標頭。 如要驗證後端伺服器是否確實傳送回應酬載主體和/或「可能原因」中提及的一或多個標頭,請按照下列步驟操作:
如果您是公有雲使用者,且可以從任何系統直接向後端伺服器發出相同的 API 要求。
- 如果您是私有雲使用者,則可直接從與特定機構和環境相關聯的其中一個訊息處理器,向後端伺服器發出相同的 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 Reset Content。也就是說,後端伺服器不得在 204 No Content 或 205 Reset Content 回應中傳送下列內容:
- 回應酬載主體
- 以及下列任一標頭:
Content-LengthContent-EncodingTransfer-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 Reset Content |
注意事項
建議的解決方法是修正後端伺服器,傳送 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 Reset Content 的規格。
如果仍需要 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