您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件。 資訊
問題
用戶端應用程式會收到 502 Bad Gateway
的 HTTP 狀態碼,以及代碼 ECONNRESET
做為 Edge Microgateway 中的 API 呼叫回應。
錯誤訊息
用戶端會顯示以下回應代碼:
HTTP/1.1 502 Bad Gateway
回應會包含以下錯誤訊息:
{"message":"socket hang up","code":"ECONNRESET"}
可能原因
原因 | 說明 | 適用的疑難排解指示 |
---|---|---|
保持運作逾時設定錯誤 | Edge Microgateway 和目標伺服器之間的保持運作逾時設定不正確。 | Edge Public and Private Cloud 使用者 |
目標伺服器太早關閉連線 | 目標伺服器過早關閉連線,而 Edge Microgateway 能夠傳送要求酬載。 | Edge Public and Private Cloud 使用者 |
常見診斷步驟
- 查看 Edge Microgateway 記錄:
/var/tmp/edgemicro-`hostname`-*.log
- 搜尋特定時間範圍內 (如果問題在過去) 是否有包含代碼
ECONNRESET
的502
錯誤,或是否有任何要求仍因502
失敗。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][]
- 如果記錄層級設為
warn
或info
,還會顯示[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]
- 錯誤代碼
[socket hang up][ECONNRESET]
表示目標伺服器已關閉與 Edge Microgateway 的連線。您可在記錄檔中搜尋這項查詢,以判斷問題的發生頻率。
原因:保持運作逾時設定不正確
診斷
使用 tcpdump
- 使用下列指令,在 Edge Microgateway 和 Edge Microgateway 主機作業系統上的後端伺服器之間擷取
tcpdump
:tcpdump -i any -s 0 host TARGET_SERVER_HOSTNAME -w FILENAME.pcap
- 分析擷取的
tcpdump
:tcpdump 輸出內容範例:( 查看較大的圖片)
在上述
tcpdump
範例中,您可以看到以下內容:- 在封包 250288 中,用戶端傳送
POST
要求。 - 在封包 250371 中,伺服器會回應
200 OK
。 - 在封包 250559 中,用戶端傳送
ACK.
- 在封包 250560 中,伺服器會傳送
Continuation
訊息。 - 在封包 250561 中,用戶端傳送
ACK.
- 在封包 262436 中,伺服器傳送
FIN, ACK
至用戶端,啟動關閉連線。請注意,從上一個封包後大約 5 秒 (250561)。 - 在封包 262441 中,用戶端傳送另一個
POST
要求。但是,由於伺服器已啟動連線,因此這項作業會失敗。它在封包 262441 中以RST
回應。
在此範例中至少重複使用連線一次,但在最終要求中,伺服器會在閒置五秒過後 (即用戶端傳送新的要求時) 啟動連線關閉。這表示後端伺服器的保持運作逾時時間很可能較短或等於用戶端中設定的值。如要驗證這一點,請參閱「比較 Edge Microgateway 和後端伺服器的保持運作逾時」。
- 在封包 250288 中,用戶端傳送
比較保持運作逾時
- Edge Microgateway 沒有特定的保持運作逾時屬性。這取決於執行時的作業系統。常見的範例包括 Windows、Linux 和 Docker 容器。
- 這可在作業系統中自訂。詳情請洽詢系統管理員。根據預設,Linux 作業系統的預設保持運作逾時時間為兩小時。
- 接著,檢查後端伺服器上設定的保持運作逾時屬性。假設您將後端伺服器設為 10 秒的值,
- 如果您確定作業系統的保持運作逾時值高於後端伺服器上保持運作逾時屬性的值 (如上例所示),就是導致
502
錯誤的原因。
解析度
請確保在搭載 Edge Microgateway 的作業系統,比起後端伺服器上的設定,保持運作逾時屬性一律較低。
- 判定後端伺服器上保持運作逾時的值。
- 使用作業系統適用的步驟,為作業系統中的保持運作逾時屬性設定適當的值,讓保持運作逾時屬性低於後端伺服器設定的值。
最佳做法
強烈建議您將下游元件的保持運作逾時門檻一律低於上游伺服器的保持運作逾時門檻,以免發生這類競爭狀況和 502
錯誤。每個下游躍點應低於每個上游躍點。在 Edge Microgateway 中,建議您使用下列準則:
用戶端應用程式或負載平衡器的保持運作逾時時間應小於 Edge Microgateway 保持運作逾時。
如要為 Edge Microgateway 設定保持運作逾時,請將
keep_alive_timeout
值新增至~/.edgemicro/org-env-config.yaml
檔案。edgemicro: keep_alive_timeout: 65000
- Edge Microgateway 作業系統的保持運作逾時時間應小於目標伺服器的保持運作逾時。
- 如果您在 Edge Microgateway 的前方或後方有其他躍點,則應套用相同的規則。您應一律將其保留為下游用戶端關閉與上游的連線。
原因:目標伺服器太早關閉連線
診斷
- 按照常見診斷步驟所述的步驟操作,確認是否收到
[socket hang up][ECONNRESET]
錯誤。 - 如果是,請按照下列說明使用
tcpdump
進一步調查問題。上述範例中的錯誤訊息
[targetRequest error][GET][][socket hang up][ECONNRESET]
表示 Edge Microgateway 傳送要求到後端 (目標) 伺服器時發生這項錯誤。也就是說,Edge Microgateway 已將 API 要求傳送至後端伺服器,正在等候回應。不過,在 Edge Microgateway 收到回應之前,後端伺服器會突然終止連線。 - 檢查後端伺服器記錄,確認是否有任何錯誤或資訊可能導致後端伺服器突然終止連線。如果發現任何錯誤或資訊,請前往「Resolution」,並在後端伺服器中適當修正問題。
- 如果在後端伺服器中找不到任何錯誤或資訊,請在 Edge Microgateway 伺服器上收集
tcpdump
輸出內容:tcpdump -i any -s 0 host TARGET_SERVER_HOSTNAME -w FILENAME.pcap
- 分析擷取的
tcpdump
:tcpdump 輸出內容範例:( 查看較大的圖片)
在上述
tcpdump
範例中,您可以看到以下內容:- 在封包 4 中,Edge Microgateway 會將
GET
要求傳送至目標伺服器。 - 在封包 5 中,目標伺服器回應了
ACK
以確認要求。 - 但在封包 6 中,目標伺服器會傳送
FIN, ACK
來關閉連線,而不是回應回應酬載。 - 在 7 以上的封包中,連線會雙向關閉。由於連線在回應傳送前已關閉,Edge Microgateway 會將 HTTP
502
錯誤傳回至用戶端。 - 請注意,封包 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
各有一個。請為受影響的機構和環境完整上傳這個檔案。
- 在封包 4 中,Edge Microgateway 會將