查看 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 診斷錯誤:
- 以下列使用者身分登入 Apigee Edge UI: 擔任適當角色
切換到您要調查問題的機構。
- 前往「Analyze」(分析) >「API 監控 >調查頁面。
- 請選取您發現錯誤的確切時間範圍。
- 確認「Proxy」篩選器已設為「All」。
- 根據「時間」繪製「Fault Code」指標。
選取含有錯誤程式碼
protocol.http.DuplicateHeader
的儲存格,如下所示:(查看較大的圖片)。
錯誤程式碼
protocol.http.DuplicateHeader
的相關資訊顯示如下:(查看較大的圖片)。
- 確認「狀態碼」為
502
,如上述範例所示。 - 按一下「查看記錄」,然後展開失敗要求的資料列。
在「Logs」(記錄檔) 視窗中,記下下列詳細資料:
- 狀態碼:
502
- 錯誤來源:
target
- 錯誤代碼:
protocol.http.DuplicateHeader
。
- 狀態碼:
- Fault Source 為
target
,表示來自後端伺服器的回應包含重複的標頭。
追蹤工具
如何使用追蹤工具診斷錯誤:
- 啟用追蹤工作階段,並
- 等待
502 Bad Gateway
錯誤發生,或 - 如果可以重現問題,請發出 API 呼叫並重現
502 Bad Gateway
個錯誤
- 等待
確保已啟用「Show all Flow Infos」:
- 請選取其中一個失敗的要求,然後檢查追蹤記錄。
- 瀏覽追蹤記錄的各個階段,找出失敗的部分。
錯誤通常會在「要求已傳送至目標」後於流程中發生。 伺服器階段,如下所示:
(查看較大的圖片)。
記下追蹤記錄中的錯誤值。
上述追蹤記錄範例將錯誤顯示為
Duplicate Header "Expires"
。開始時間 要求傳送至後端伺服器後,Apigee 會發生這個錯誤, 後端伺服器多次傳送標頭Expires
。- 前往追蹤記錄中的「AX」AX(已記錄 Analytics 資料) 階段,並按一下該階段。
向下捲動至「Phase Details - Response Headers」部分,然後找出 X-Apigee-fault-code 和 X-Apigee-fault-source 的值,如下所示:
(查看較大的圖片)。
- 您會看到 X-Apigee-fault-code 和 X-Apigee-fault-source 的值。
例如
protocol.http.DuplicateHeader
和target
,表示 此錯誤會導致後端伺服器為 回應標頭Expires
。回應標頭 值 X-Apigee-fault-code protocol.http.DuplicateHeader
X-Apigee-fault-source target
檢查您是否使用 Proxy 鏈結; 也就是如果目標伺服器或目標端點在 Apigee 叫用其他 Proxy 時,就會發生這種情況。
如要判斷實際情況,請返回「Request sent to target」伺服器階段。 按一下「顯示 Curl」。
系統會隨即開啟「Curl for Request Sent to Target Server」視窗,供您 判斷目標伺服器主機別名。
- 如果目標伺服器主機別名指向虛擬主機別名,表示該別名為 Proxy。
鏈結。在這種情況下,您需要針對鏈結的 Proxy 重複執行上述所有步驟,直到
判斷是
502 Bad Gateway
錯誤的真正原因。 - 如果目標伺服器主機別名指向您的後端伺服器,則表示 您的後端伺服器正在將重複的標頭傳送至 Apigee。
NGINX
如何使用 NGINX 存取記錄診斷錯誤:
- 如果您是 Private Cloud 使用者,可以使用 NGINX 存取記錄
來判斷 HTTP
502
錯誤的相關重要資訊。 查看 NGINX 存取記錄:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
其中: ORG、ENV 和 PORT# 會替換為 實際價值
- 搜尋,查看在特定期間是否有任何
502
錯誤 (如果問題是過去發生) 或者502
。 如果 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
原因:回覆中的標頭重複
診斷
- 針對使用 API 觀察到的錯誤判斷「錯誤程式碼」和「錯誤來源」 監控或 NGINX 存取記錄,方法請見常見診斷步驟。
- 如果 Fault Source 的值為
target
,表示回應 目標伺服器傳送的值包含重複標頭。 您可以判斷在回應中傳送多次的實際標頭 類型:
錯誤訊息
使用錯誤訊息:
如果您可以存取 Apigee Edge 收到的完整錯誤訊息,可參閱 至
faultstring
。faultstring
包含要擷取的 已經收到重複通知錯誤訊息示例:
"faultstring":"Duplicate Header \"Expires\""
- 在上述錯誤訊息中,您會看到標頭
Expires
已送出 重複出現在faultstring
中。
實際要求
使用實際要求:
- 如果您無法存取對目標伺服器提出的實際要求,請
系統會依據 Cloud 控制台中相應的
curl
指令 「使用追蹤工具」步驟 10.a 和 步驟 10.b。 如果您可以存取對目標伺服器應用程式實際發出的要求, 然後執行下列步驟:
呼叫目標伺服器。
此範例中所用目標伺服器的要求範例:
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
驗證回應中顯示的標頭清單。
在此範例中使用的目標伺服器回應範例:
* ...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
。如果名稱出現在
faultstring
中的標頭 就會發生這種情況 錯誤。在上述情況中,Expires
標頭會重複傳送。
解析度
修正重複問題
選項 #1 [建議選項] 修正後端伺服器,避免加入重複標頭
- 分析特定後端伺服器的原因以傳送重複標頭
Expires
,並驗證 API Proxy 是否可以接受。於 根據 HTTP 規格 RFC7230。 - 如果您不希望此設定,請修改目標伺服器應用程式,不要傳送重複的標頭。
在上述範例中,我們發現標頭
Expires
已傳送 建立兩次,但這並非最理想的情況如要修正問題,請確認 目標伺服器只會傳遞Expires
標頭一次。 - 如果您想要允許的話,如要允許重複的標頭,請前往 選項 #2 使用 CwC 屬性。
CwC
選項 #2 使用 CwC 屬性
Apigee 提供 CwC 屬性
HTTPHeader.<HeaderName>
,可讓用戶端應用程式和
,以便將重複的標頭傳送至 Apigee Edge 中的 API Proxy。
CwC 資源 | 值 |
---|---|
HTTPHeader.<HeaderName> |
allowDuplicates,multivalued |
舉例來說,您可以在「訊息處理器」中設定下列屬性,允許系統重複郵件
標頭 Expires
和多個值。
HTTPHeader.Expires=allowDuplicates, multiValued
- 如果您是 Private Cloud 使用者,可以設定屬性來禁止 Apigee
引發
502 Bad Gateway
錯誤的邊緣 (即使要求包含 重複標題 設定郵件處理器以使用重複標頭的教學指南。 - 如果您是公用雲端使用者,請與 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
其中: ORG、ENV 和 PORT# 會替換為 實際價值
- 訊息處理器系統記錄
/opt/apigee/var/log/edge-message-processor/logs/system.log