502 閘道錯誤 - 掛斷電話掛斷

您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件
info

問題

用戶端應用程式會收到 HTTP 狀態碼 502 Bad Gateway,以及 Edge Microgateway 中 API 呼叫的回應代碼 ECONNRESET

錯誤訊息

用戶端會看到下列回應代碼:

HTTP/1.1 502 Bad Gateway

回應會包含下列錯誤訊息:

{"message":"socket hang up","code":"ECONNRESET"}

可能原因

原因 說明 適用於以下裝置的疑難排解說明
Keep-alive 逾時設定錯誤 Edge Microgateway 與目標伺服器之間的 Keep-alive 超時設定有誤。 Edge 公有和私有雲使用者
目標伺服器過早關閉連線 Edge Microgateway 傳送要求酬載時,目標伺服器過早關閉連線。 Edge 公有和私有雲使用者

常見的診斷步驟

  1. 檢查 Edge Microgateway 記錄:
    /var/tmp/edgemicro-`hostname`-*.log
  2. 搜尋特定時間內是否有任何502錯誤 (如果問題發生在過去),或是否有任何要求仍失敗並顯示 502ECONNRESET
    2021-06-23T03:52:24.110Z [error][0:8000][3][myorg][test]
    [emg_badtarget/flakey/hangup][][][6b089a00-d3d6-11eb-95aa-911f1ee6c684]
    [microgateway-core][][GET][502][socket hang up][ECONNRESET][]
  3. 如果記錄層級設為 warninfo,第二個元素中也會有 [warn] 訊息,包括目標伺服器主機名稱和連接埠。在本範例中,這是 X.X.X.X:8080,稍後可用於擷取 tcpdump
    2021-06-23T03:52:24.109Z
    [warn][X.X.X.X:8080][3][myorg][test][emg_badtarget/flakey/hangup]
    [][][6b089a00-d3d6-11eb-95aa-911f1ee6c684][plugins-middleware]
    [targetRequest error][GET][][socket hang up][ECONNRESET][395]
  4. 錯誤代碼 [socket hang up][ECONNRESET] 表示目標伺服器已關閉與 Edge Microgateway 的連線。您可以在記錄中搜尋這項資訊,判斷發生頻率。

原因:Keep-alive 逾時設定有誤

診斷

  1. 按照「常見診斷步驟」一節中的步驟操作,確認是否收到 [socket hang up][ECONNRESET] 錯誤。
  2. 如果是,請按照下文說明,透過 tcpdump 進一步調查:

使用 tcpdump

  1. 在 Edge Microgateway 主機作業系統上,使用下列指令擷取 Edge Microgateway 與後端伺服器之間的 tcpdump
    tcpdump -i any -s 0 host TARGET_SERVER_HOSTNAME -w FILENAME.pcap
    
  2. 分析擷取的 tcpdump

    tcpdump 輸出內容範例: ( 查看較大圖片)

    在上述範例 tcpdump 中,您可以看到下列內容:

    1. 在封包 250288 中,用戶端會傳送 POST 要求。
    2. 在封包 250371 中,伺服器會以 200 OK 回應。
    3. 在封包 250559 中,用戶端會傳送 ACK.
    4. 在封包 250560 中,伺服器會傳送 Continuation 訊息。
    5. 在封包 250561 中,用戶端會傳送 ACK.
    6. 在封包 262436 中,伺服器會將 FIN, ACK 傳送至啟動連線關閉的用戶端。請注意,這大約是前一個封包 (250561) 後的五秒。
    7. 在封包 262441 中,用戶端會傳送另一個 POST 要求。不過,由於伺服器已啟動連線關閉程序,因此這項作業會失敗。並以封包 262441 中的 RST 回應。

    在這個範例中,至少成功重複使用過一次相同連線,但在最後一個要求中,伺服器會在閒置五秒後啟動連線關閉作業,這剛好與用戶端傳送新要求的時間相同。這表示後端伺服器 keep-alive 逾時時間很可能短於或等於用戶端設定的值。如要驗證這點,請參閱「比較 Edge Microgateway 和後端伺服器的 Keep-Alive 逾時」。

比較 keep-alive 逾時

  1. Edge Microgateway 沒有特定的 keep-alive 逾時屬性。這取決於執行該程序的作業系統。常見的例子包括 Windows、Linux 和 Docker 容器。
  2. 這可能是作業系統的自訂設定。請洽詢系統管理員。根據預設,Linux 作業系統的預設連線存續逾時時間為兩小時。
  3. 接著,請檢查後端伺服器上設定的 Keep-Alive 超時屬性。假設後端伺服器設定的值為 10 秒。
  4. 如果您判斷作業系統的連線存續逾時值高於後端伺服器的連線存續逾時屬性值 (如上述範例所示),這就是造成 502 錯誤的原因。

解析度

請務必確保執行 Edge Microgateway 的作業系統,其連線存續逾時屬性一律低於後端伺服器。

  1. 判斷後端伺服器上為 keep-alive 逾時設定的值。
  2. 在作業系統中為 keep-alive 逾時屬性設定適當的值,確保 keep-alive 逾時屬性低於後端伺服器上設定的值。請按照適用於您作業系統的步驟操作。

最佳做法

強烈建議下游元件的 keep-alive 逾時門檻一律要低於上游伺服器設定的值,以免發生這類競爭狀況和 502 錯誤。每個下游躍點應低於每個上游躍點。在 Edge Microgateway 中,建議遵循下列準則:

  1. 用戶端應用程式或負載平衡器的 keep-alive 逾時時間,應小於 Edge Microgateway 的 keep-alive 逾時時間。

    如要在 Edge Microgateway 上設定 keep-alive 逾時,請將 keep_alive_timeout 值新增至 ~/.edgemicro/org-env-config.yaml 檔案。

    edgemicro:
      keep_alive_timeout: 65000
  2. Edge Microgateway 作業系統的 keep-alive 逾時應小於目標伺服器的 keep-alive 逾時。
  3. 如果 Edge Microgateway 前後有其他躍點,也應套用相同規則。您應一律將關閉與上游連線的責任留給下游用戶端。

原因:目標伺服器過早關閉連線

診斷

  1. 按照「常見診斷步驟」一文中的說明操作,確認是否收到 [socket hang up][ECONNRESET] 錯誤。
  2. 如果是,請按照下文說明,使用 tcpdump 進一步調查。

    上述範例中的錯誤訊息 [targetRequest error][GET][][socket hang up][ECONNRESET] 表示 Edge Microgateway 在將要求傳送至後端 (目標) 伺服器時發生錯誤。也就是說,Edge Microgateway 已將 API 要求傳送至後端伺服器,並等待回應。不過,後端伺服器在 Edge Microgateway 收到回應前,突然終止連線。

  3. 檢查後端伺服器記錄,看看是否有任何錯誤或資訊,可能導致後端伺服器突然終止連線。如果發現任何錯誤或資訊,請前往「解決方法」,並在後端伺服器中適當修正問題。
  4. 如果後端伺服器沒有任何錯誤或資訊,請在 Edge Microgateway 伺服器上收集 tcpdump 輸出內容:
    tcpdump -i any -s 0 host TARGET_SERVER_HOSTNAME -w FILENAME.pcap
    
  5. 分析擷取的 tcpdump

    tcpdump 輸出內容範例: ( 查看較大圖片)

    在上述範例 tcpdump 中,您可以看到下列內容:

    1. 在封包 4 中,Edge Microgateway 將 GET 要求傳送至目標伺服器。
    2. 在封包 5 中,目標伺服器會以 ACK 回應,確認要求。
    3. 不過,在封包 6 中,目標伺服器並未傳送回應酬載,而是傳送 FIN, ACK,啟動連線關閉程序。
    4. 在封包 7 之後,連線會相互關閉。由於連線在傳送回應前已關閉,Edge Microgateway 會將 HTTP 502 錯誤傳回給用戶端。
    5. 請注意,封包 8 的時間戳記 (2021-06-23T03:52:24.110Z ) 對應於 Edge Microgateway 記錄檔中記錄錯誤的時間戳記。記錄檔和 tcpdump 中的時間戳記通常可用於將錯誤與實際封包建立關聯。

    解析度

    在後端伺服器上適當修正問題。

    如果問題仍未解決,且您需要協助排解 502 Bad Gateway Error 問題,或懷疑是 Edge Microgateway 內部問題,請參閱「必須收集診斷資訊」。

    必須收集診斷資訊

    如果按照上述指示操作後問題仍未解決,請收集下列診斷資訊,然後與 Apigee Edge 支援團隊聯絡:

    • 記錄檔:預設資料夾為 /var/tmp,但可在主要 config.yaml 檔案 (logging > dir parameter) 中覆寫。建議先將 log > level 變更為 info,再將記錄檔提供給 Apigee 支援團隊。
    • 設定檔:Edge Microgateway 的主要設定位於預設 Edge Microgateway 資料夾 $HOME/.edgemicro 中的 YAML 檔案。預設設定檔名為 default.yaml,每個環境都有一個設定檔 ORG-ENV-config.yaml。請上傳受影響機構和環境的完整檔案。