502 閘道錯誤 - ResponseWithBody

查看 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 Content205 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 Content205 Reset Content。回應標頭 例如 Content-LengthContent-EncodingTransfer-Encoding 表示回應酬載的大小、類型或格式。

因此,Apigee Edge 會傳回 502 Bad Gateway 狀態碼: 根據下列程式碼 protocol.http.ResponseWithBody 傳回錯誤代碼 情況:

後端伺服器的狀態碼
來自後端伺服器的回應包含 204 沒有內容 205 重設內容
回應主體 錯誤 錯誤

Content-Length 個標題

(設為非零)

錯誤 錯誤

Content-Encoding

(設為 Apigee Edge 支援的編碼)

錯誤 沒有錯誤
Transfer-Encoding 錯誤 錯誤

以下是導致這個錯誤的可能原因:

原因 說明 適用的疑難排解操作說明
來自後端伺服器傳回 204 回應的回應主體或標頭 後端伺服器傳送 204 No Content205 Reset Content 這個回應含有回應主體和/或一或多個標頭 Content-TypeContent-EncodingTransfer-Encoding 邊緣公有雲和私有雲使用者

常見的診斷步驟

請使用下列其中一項工具/技巧診斷這個錯誤:

API Monitoring

如何使用 API Monitoring 診斷錯誤:

  1. 以下列使用者身分登入 Apigee Edge UI 擔任適當角色
  2. 切換到您要調查問題的機構。

  3. 前往「Analyze」(分析) >「API 監控 >調查頁面。
  4. 請選取您發現錯誤的確切時間範圍。
  5. 根據「時間」繪製「Fault Code」指標。
  6. 選取含有錯誤程式碼 protocol.http.ResponseWithBody 的儲存格 如下所示:

    ( 查看較大的圖片)

  7. 畫面上會顯示錯誤程式碼的相關資訊 protocol.http.ResponseWithBody,如下所示:

    ( 查看較大的圖片)

  8. 按一下「查看記錄」,然後展開失敗要求的資料列。

    ( 查看較大的圖片)

  9. 在「Logs」(記錄檔) 視窗中,記下下列詳細資料:
    • 狀態碼: 502
    • 錯誤來源: target
    • 錯誤代碼: protocol.http.ResponseWithBody
  10. 如果錯誤來源的值target錯誤 程式碼的值為 protocol.http.ResponseWithBody,則 表示發生錯誤,因為後端伺服器 204 No Content205 Reset Content 狀態碼,其中包含 回應內文和/或 可能原因一節。

追蹤工具

如何使用追蹤工具診斷錯誤:

  1. 啟用追蹤工作階段 和下列其中一項:
    1. 等待 502 Bad Gateway 錯誤發生。或
    2. 如果可以重現問題,請發出 API 呼叫,並重現 502 Bad Gateway 錯誤。
  2. 確保已啟用「Show all FlowInfos」

  3. 請選取其中一個失敗的要求,然後檢查追蹤記錄。
  4. 瀏覽追蹤記錄的各個階段,找出失敗之處 發生。
  5. 錯誤通常會出現在 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
  6. 前往追蹤記錄中的「AX」AX(已記錄的 Analytics 資料) 階段 然後按一下
  7. 向下捲動至「Phase Details」、「Error Headers」部分,然後 確定 X-Apigee-fault-codeX-Apigee-fault-source 的值 如下所示:

    ( 查看較大的圖片)

  8. 請注意,X-Apigee-fault-codeX-Apigee-fault-source 的值 are protocol.http.ResponseWithBodytarget。 這表示發生錯誤是因為後端伺服器 204 No Content205 Reset Content 狀態碼 回應內文和/或「可能原因」中提及的任一標頭。
    錯誤
    X-Apigee-fault-code protocol.http.ResponseWithBody
    X-Apigee-fault-source target

NGINX

如何使用 NGINX 存取記錄診斷錯誤:

  1. 如果您是 Private Cloud 使用者,可以使用 NGINX 存取記錄 然後判斷 HTTP 502 Bad Gateway 的重要資訊。
  2. 查看 NGINX 存取記錄:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

    其中: ORGENVPORT# 會替換為實際值。

  3. 搜尋是否有任何 502 錯誤和錯誤代碼 在特定時間範圍內的protocol.http.ResponseWithBody (如果問題是過去發生) 或者 502
  4. 如果發現任何含有 X-Apigee-fault-code502 錯誤 與 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
  5. 請注意,X-Apigee-fault-codeX-Apigee-fault-source 的值 分別為 protocol.http.ResponseWithBodytarget。 這表示發生錯誤是因為後端伺服器 204 No Content205 Reset Content 狀態碼 回應內文和/或「可能原因」中提及的任一標頭。

原因:後端伺服器傳回 204 回應的回應主體或標頭

診斷

  1. 針對使用 API 觀察到的錯誤判斷「錯誤程式碼」和「錯誤來源」 Monitoring、Trace 工具或 NGINX 存取記錄 常見的診斷步驟
  2. 如果「Fault Code」protocol.http.ResponseWithBody,且 Fault Source 的值為 target,表示後端 伺服器回應了 204 No Content205 Reset Content 狀態 回應內文和/或上述任一標頭 可能原因
  3. 驗證後端伺服器是否確實傳送了回應酬載主體和/或 或「可能原因」一節中提及的一或多個標頭,您可以 請執行下列步驟:

    1. 如果您是公用雲端使用者,而且是否可以向 或直接存取後端伺服器

    2. 如果您是 Private Cloud 使用者,可以向 或與特定 Deployment 關聯的同一則訊息 發現故障的組織和環境
    3. 查看從後端伺服器收到的回應,並確認其中包含 回應酬載主體和/或上述一或多個標頭。如果是, 發生這項錯誤的原因

      範例 #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.

    4. 在上述所有範例中,後端伺服器傳送了 204 No Content 或 包含回應主體和/或其中一個標頭的 205 Reset Content 狀態碼 一文中提到的「可能原因」一節。
    5. 因此,Apigee Edge 傳送了 502 Bad Gateway 狀態碼及錯誤代碼 protocol.http.ResponseWithBody

解析度

確保後端伺服器一律遵循規格要求 RFC 7231,6.3.6 節:205 重設內容 (在傳送 204 No Content 時 或 205 Reset Content 回應 Apigee Edge也就是說 請勿204 No Content205 Reset Content 回應:

  1. 回應酬載主體
  2. 以及下列任一標題:
    1. Content-Length
    2. Content-Encoding
    3. Transfer-Encoding

規格

Apigee Edge 會以 502 Bad Gateway 狀態碼和錯誤代碼回應 protocol.http.ResponseWithBody如果後端伺服器 204 No Content205 Reset Content 回應,但 不符合下列 RFC 規格:

規格
RFC 7231,6.3.5 節:204 No Content
RFC 7231,6.3.6 節:205 重設內容

要點

建議的解決方案是修正後端伺服器,以傳送 204 No Content205 Reset Content 狀態碼,其中沒有回應主體和 標題 - Content-LengthContent-EncodingTransfer-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

    其中: ORGENVPORT# 會替換為 實際價值

  • 訊息處理器系統記錄:/opt/apigee/var/log/edge-message-processor/logs/system.log