502 閘道錯誤 - 重複標頭

查看 Apigee Edge 說明文件。
前往 Apigee X說明文件
資訊

問題

用戶端應用程式收到 HTTP 狀態碼 502 Bad Gateway 和錯誤代碼 protocol.http.DuplicateHeader 做為 API 呼叫的回應。

錯誤訊息

用戶端應用程式會取得下列回應代碼:

HTTP/1.1 502 Bad Gateway

此外,您可能也會看到類似以下的錯誤訊息:

{
   "fault":{
      "faultstring":"Duplicate Header \"Expires\"",
      "detail":{
         "errorcode":"protocol.http.DuplicateHeader"
      }
   }
}

可能原因

如果特定 HTTP 標頭無法在 Apigee 中含有重複的值,就會發生這個錯誤 Edge 會以相同或不同的值,出現在由 將後端伺服器連線至 Apigee Edge

截至 RFC 7230 的第 3.2.2 節:欄位順序 ,寄件者「不得」產生多個標頭 訊息中具有相同欄位名稱的欄位,除非該欄位的所有欄位值皆相同 標頭欄位的定義為以半形逗號分隔的清單,例如#(values)] 或是標頭欄位 如果 Apigee Edge 發現有特定的標頭,就無法 而 HTTP 回應 會傳送重複項目, 目標/後端伺服器 它會傳回 502 Bad Gateway 和錯誤代碼 protocol.http.DuplicateHeader

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

原因 說明 適用的疑難排解操作說明
回覆中的標頭重複 後端伺服器的回應中含有重複的標頭。 邊緣公有雲和私有雲使用者

常見的診斷步驟

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

API Monitoring

如何使用 API Monitoring 診斷錯誤:

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

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

    (查看較大的圖片)。

  8. 錯誤程式碼 protocol.http.DuplicateHeader 的相關資訊顯示如下:

    (查看較大的圖片)。

  9. 確認「狀態碼」502,如上述範例所示。
  10. 按一下「查看記錄」,然後展開失敗要求的資料列。
  11. 在「Logs」(記錄檔) 視窗中,記下下列詳細資料:

    • 狀態碼: 502
    • 錯誤來源: target
    • 錯誤代碼: protocol.http.DuplicateHeader
  12. Fault Sourcetarget,表示來自後端伺服器的回應包含重複的標頭。

追蹤工具

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

  1. 啟用追蹤工作階段,並
    1. 等待 502 Bad Gateway 錯誤發生,或
    2. 如果可以重現問題,請發出 API 呼叫並重現 502 Bad Gateway 個錯誤
  2. 確保已啟用「Show all Flow Infos」

  3. 請選取其中一個失敗的要求,然後檢查追蹤記錄。
  4. 瀏覽追蹤記錄的各個階段,找出失敗的部分。
  5. 錯誤通常會在「要求已傳送至目標」後於流程中發生。 伺服器階段,如下所示:

    (查看較大的圖片)。

  6. 記下追蹤記錄中的錯誤值。

    上述追蹤記錄範例將錯誤顯示為 Duplicate Header "Expires"。開始時間 要求傳送至後端伺服器後,Apigee 會發生這個錯誤, 後端伺服器多次傳送標頭 Expires

  7. 前往追蹤記錄中的「AX」AX(已記錄 Analytics 資料) 階段,並按一下該階段。
  8. 向下捲動至「Phase Details - Response Headers」部分,然後找出 X-Apigee-fault-codeX-Apigee-fault-source 的值,如下所示:

    (查看較大的圖片)。

  9. 您會看到 X-Apigee-fault-codeX-Apigee-fault-source 的值。 例如 protocol.http.DuplicateHeadertarget,表示 此錯誤會導致後端伺服器為 回應標頭 Expires
    回應標頭
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source target
  10. 檢查您是否使用 Proxy 鏈結; 也就是如果目標伺服器或目標端點在 Apigee 叫用其他 Proxy 時,就會發生這種情況。

    1. 如要判斷實際情況,請返回「Request sent to target」伺服器階段。 按一下「顯示 Curl」

    2. 系統會隨即開啟「Curl for Request Sent to Target Server」視窗,供您 判斷目標伺服器主機別名。

    3. 如果目標伺服器主機別名指向虛擬主機別名,表示該別名為 Proxy。 鏈結。在這種情況下,您需要針對鏈結的 Proxy 重複執行上述所有步驟,直到 判斷是 502 Bad Gateway 錯誤的真正原因。
    4. 如果目標伺服器主機別名指向您的後端伺服器,則表示 您的後端伺服器正在將重複的標頭傳送至 Apigee。

NGINX

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

  1. 如果您是 Private Cloud 使用者,可以使用 NGINX 存取記錄 來判斷 HTTP 502 錯誤的相關重要資訊。
  2. 查看 NGINX 存取記錄:

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

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

  3. 搜尋,查看在特定期間是否有任何 502 錯誤 (如果問題是過去發生) 或者 502
  4. 如果 X-Apigee-fault-code 未顯示任何 502 錯誤 protocol.http.DuplicateHeader 的值相符,則 判斷 X-Apigee-fault-source. 的價值。

    NGINX 存取記錄中的 502 錯誤示例:

    上述 NGINX 存取記錄範例項目中的 X- Apigee-fault-code X-Apigee-fault-source:

    回應標頭
    X-Apigee-fault-code protocol.http.DuplicateHeader
    X-Apigee-fault-source target

原因:回覆中的標頭重複

診斷

  1. 針對使用 API 觀察到的錯誤判斷「錯誤程式碼」和「錯誤來源」 監控或 NGINX 存取記錄,方法請見常見診斷步驟
  2. 如果 Fault Source 的值為 target,表示回應 目標伺服器傳送的值包含重複標頭。
  3. 您可以判斷在回應中傳送多次的實際標頭 類型:

    錯誤訊息

    使用錯誤訊息:

    1. 如果您可以存取 Apigee Edge 收到的完整錯誤訊息,可參閱 至 faultstringfaultstring 包含要擷取的 已經收到重複通知

      錯誤訊息示例:

      "faultstring":"Duplicate Header \"Expires\""
      
    2. 在上述錯誤訊息中,您會看到標頭 Expires 已送出 重複出現在 faultstring 中。

    實際要求

    使用實際要求:

    1. 如果您無法存取對目標伺服器提出的實際要求,請 系統會依據 Cloud 控制台中相應的 curl 指令 「使用追蹤工具」步驟 10.a 和 步驟 10.b。
    2. 如果您可以存取對目標伺服器應用程式實際發出的要求, 然後執行下列步驟:

      1. 呼叫目標伺服器。

        此範例中所用目標伺服器的要求範例:

        curl -X GET "https://BACKEND_SERVER_HOST/response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT" -v
        
      2. 驗證回應中顯示的標頭清單。

        在此範例中使用的目標伺服器回應範例:

        * ...Trimmed...
        > GET /response-headers?Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT&Expires=Mon%2C%2021%20June%202021%2007%3A28%3A00%20GMT HTTP/2
        > Host: BACKEND_SERVER_HOST
        > User-Agent: curl/7.64.1
        > Accept: */*
        >
        * Connection state changed (MAX_CONCURRENT_STREAMS == 128)!
        < HTTP/2 200
        < date: Fri, 02 Jul 2021 05:29:07 GMT
        < content-type: application/json
        < content-length: 166
        < server: gunicorn/19.9.0
        < Expires: Mon, 21 June 2021 07:28:00 GMT
        < Expires: Mon, 21 June 2021 07:28:00 GMT
        < access-control-allow-origin: *
        < access-control-allow-credentials: true
        <
        ----<Response BODY>------
        * Connection #0 to host httpbin.org left intact
        * Closing connection 0
        

        在上述要求範例中,系統進一步傳送 Expires 標頭 超過 1 次因此,這項要求因 502 Bad Gateway 而失敗 錯誤訊息和錯誤代碼:protocol.http.DuplicateHeader

      3. 如果名稱出現在 faultstring 中的標頭 就會發生這種情況 錯誤。在上述情況中,Expires 標頭會重複傳送。

解析度

修正重複問題

選項 #1 [建議選項] 修正後端伺服器,避免加入重複標頭

  1. 分析特定後端伺服器的原因以傳送重複標頭 Expires,並驗證 API Proxy 是否可以接受。於 根據 HTTP 規格 RFC7230
  2. 如果您不希望此設定,請修改目標伺服器應用程式,不要傳送重複的標頭。 在上述範例中,我們發現標頭 Expires 已傳送 建立兩次,但這並非最理想的情況如要修正問題,請確認 目標伺服器只會傳遞 Expires 標頭一次。
  3. 如果您想要允許的話,如要允許重複的標頭,請前往 選項 #2 使用 CwC 屬性

CwC

選項 #2 使用 CwC 屬性

Apigee 提供 CwC 屬性 HTTPHeader.<HeaderName>,可讓用戶端應用程式和 ,以便將重複的標頭傳送至 Apigee Edge 中的 API Proxy。

CwC 資源
HTTPHeader.<HeaderName> allowDuplicates,multivalued

舉例來說,您可以在「訊息處理器」中設定下列屬性,允許系統重複郵件 標頭 Expires 和多個值。

HTTPHeader.Expires=allowDuplicates, multiValued
  1. 如果您是 Private Cloud 使用者,可以設定屬性來禁止 Apigee 引發 502 Bad Gateway 錯誤的邊緣 (即使要求包含 重複標題 設定郵件處理器以使用重複標頭的教學指南。
  2. 如果您是公用雲端使用者,請與 Apigee Edge 支援團隊聯絡,以便進行設定 資源有限

規格

Apigee 會回應 502 Bad Gateway 錯誤回應,因為它預期 將根據下列 RFC 規格採取行動:

規格
RFC 7230,第 3.2.2 節:欄位順序
RFC 7230,第 3.2 節:標頭欄位

如果仍需 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