您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件。 資訊
影片
影片 | 說明 |
---|---|
500 內部伺服器錯誤 - 因後端造成 | 示範後端伺服器造成的即時 500 Internal Server Error ,以及錯誤疑難排解和解決步驟。 |
問題
用戶端應用程式會取得 500
的 HTTP 狀態碼,以及訊息 Internal Server Error
做為 API 呼叫的回應。
HTTP 狀態碼 500
是一般錯誤回應,這表示伺服器發生非預期的狀況,導致無法完成要求。如果沒有其他合適的錯誤代碼,伺服器通常會傳回這個錯誤。
錯誤訊息
用戶端應用程式會取得以下回應代碼:
HTTP/1.1 500 Internal Server Error
此外,您可能會看見類似以下的錯誤訊息:
範例 #1
後端伺服器回應範例 #1
{"errorMessage":"Sorry either your e-mail or password didn't match.", "errorParameters":"{}", "errorCode":"500", "errorKey":"INVALID_EMAILPASSWORD"}
範例 #2
後端伺服器回應範例 #2
<Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <Body> <Error> <code>500</code> <message xml:lang="en-US">Not Authorised(e4138fa0-ec57).</message> </Error> </Body> </Envelope>
可能原因
有許多原因導致後端伺服器傳回 500 Internal Server Error
。本教戰手冊將說明如何使用常見步驟進行疑難排解,且不論原因為何,都能解決這個錯誤。
這個問題可能的原因如下:
原因 | 說明 | 適用的疑難排解指示 |
---|---|---|
後端伺服器發生錯誤 | 後端伺服器可能會因某些原因而失敗。 | 邊緣私有雲和公有雲使用者 |
常見診斷步驟
請使用下列其中一種工具/技巧診斷這項錯誤:
API Monitoring
程序 #1:使用 API 監控功能
如何使用 API Monitoring 診斷錯誤:
- 以 適當角色的使用者 登入 Apigee Edge UI。
切換至您想要調查問題的機構。
- 前往「分析」>「API 監控」>「調查」頁面。
- 請選取你發現錯誤的特定時間範圍。
將「Fault Code」與「Time」進行比較。
選取含有錯誤代碼
messaging.adaptors.http.flow.ErrorResponseCode
的儲存格,如下所示:( 查看較大圖片)。
錯誤代碼
messaging.adaptors.http.flow.ErrorResponseCode
的相關資訊如下所示:( 查看較大圖片)。
按一下「查看記錄」 ,然後展開失敗要求的資料列。
( 查看較大圖片)。
- 在「記錄檔」視窗中記下下列詳細資料:
- 要求郵件 ID
- 狀態碼:
500
- Fault 資料來源:
target
- 錯誤代碼:
messaging.adaptors.http.flow.ErrorResponseCode
追蹤記錄
程序 2:使用追蹤工具
如何使用追蹤工具診斷錯誤:
- 啟用追蹤工作階段,並採取下列任一做法:
- 等待發生錯誤代碼
messaging.adaptors.http.flow.ErrorResponseCode
的500 Internal Server Error
錯誤,或 - 如果可以重現問題,請透過 API 呼叫來重現問題
500 Internal Server Error
- 等待發生錯誤代碼
確保已啟用「Show all FlowInfos」:
- 請選取其中一個失敗的要求,然後檢查追蹤記錄。
- 瀏覽追蹤記錄的不同階段,找出發生錯誤的位置。
您會在「收到來自目標伺服器的回應」階段之後的流程中找到這個錯誤,如下所示:
( 查看較大圖片)。
- 前往追蹤記錄中的「AX」(Analytics (分析) 已記錄) 階段,然後按一下該階段。
向下捲動至「階段詳細資料回應標頭」區段,確定 X-Apigee-fault-code 和 X-Apigee-fault-source 及 X-Apigee-Message-ID 的值,如下所示:
( 查看較大圖片)。
- 記下 X-Apigee-fault-code、X-Apigee-fault-source 和 X-Apigee-Message-ID 的值:
回應標頭 | 值 |
---|---|
X-Apigee-fault-code | messaging.adaptors.http.flow.ErrorResponseCode |
X-Apigee-fault-source | target |
X-Apigee-Message-ID | MESSAGE_ID |
NGINX
程序 3:使用 NGINX 存取記錄檔
如何使用 NGINX 存取記錄檔診斷錯誤:
- 如果您是 Private Cloud 使用者,即可使用 NGINX 存取記錄檔來判斷 HTTP
500 Internal Server Error
的重要資訊。 查看 NGINX 存取記錄檔:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- 搜尋特定期間內 (問題過去是否發生),或是否有任何要求仍為
500
失敗,且錯誤代碼為messaging.adaptors.http.flow.ErrorResponseCode
。500
如果在 X-Apigee-fault-code 與 X-Apigee-fault-code 的值相符的情況下發現任何
500
錯誤,請判斷 X-Apigee-fault-code 的值。NGINX 存取記錄中的 500 錯誤範例:
( 查看較大圖片)。
上述 NGINX 存取記錄範例中的「X-Apigee-fault-code」X-Apigee-fault-code 和「X-Apigee-fault-source」X-Apigee-fault-code 值有下列值:
標頭 值 X-Apigee-fault-code messaging.adaptors.http.flow.ErrorResponseCode
X-Apigee-fault-source target
原因:後端伺服器發生錯誤
診斷
有很多原因會造成後端伺服器回應的 500 Internal Server Error
。您將需要單獨診斷每種情況。
- 使用 API 監控、追蹤記錄工具或 NGINX 存取記錄檔,確定 Fault Code、Fult Source 或 NGINX 存取記錄檔,如常見診斷步驟所述。
- 如果「Fault Source」為
target
,且「Fault Code」為messaging.adaptors.http.flow.ErrorResponseCode
,表示後端伺服器傳回錯誤。 - 您可以使用下列任一步驟診斷問題原因:
追蹤記錄
使用 Trace:
如果您有 Trace 工作階段的問題,請執行下列步驟:
- 在 Trace 中,選取
500 Internal Server Error
失敗的 API 要求。 在失敗的 API 要求中選取「Responsereceive from target server」(來自目標伺服器的回應) 階段,如下圖所示:
( 查看較大圖片)。
向下捲動至「階段詳細資料」部分,然後查看「回應內容」,其中包含來自後端伺服器的回應。
回應內容範例:
<Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <Body> <Error> <code>500</code> <message xml:lang="en-US">Not Authorised(e4138fa0-ec57).</message> </Error> </Body> </Envelope>
在上述回應中,請注意後端伺服器傳送的錯誤訊息「未獲授權」。這表示使用者可能通過了無效的憑證,因此會收到這個錯誤。
呼叫後端伺服器
直接呼叫後端伺服器:
您可以直接呼叫後端伺服器,並:
- 驗證您透過 Apigee Edge 傳送要求時,是否收到與收到的
500 Internal Server Error
回應相同 - 檢查後端伺服器收到的錯誤訊息 (回應)
請執行下列步驟,直接呼叫後端伺服器:
- 確認您擁有所有必要標頭、查詢參數,以及所有在要求中必須傳遞至後端伺服器的憑證。
- 如果後端服務可公開存取,您可以使用
curl
指令、Postman 或任何其他 REST 用戶端,直接叫用後端伺服器 API。 如果只有訊息處理器可以存取後端伺服器,您可以使用
curl
指令、Postman 或任何其他 REST 用戶端,直接從訊息處理器叫用後端伺服器 API。- 請驗證後端服務是否確實傳回
500 Internal Server Error
,並檢查後端伺服器傳回的錯誤訊息 (回應),並判斷這個錯誤的原因。
後端伺服器記錄
使用後端伺服器記錄
- 請查看後端伺服器記錄檔,並嘗試進一步瞭解錯誤及其原因。
- 如果可以,請在後端伺服器上啟用偵錯模式,取得更多錯誤和原因的詳細資料。
- 在 Trace 中,選取
確認您是否在失敗 API Proxy 的特定目標端點中使用 Proxy 鏈結;也就是說,目標伺服器/目標端點是否正在 Apigee Edge 中叫用其他 Proxy。確認方法如下:
如果您有失敗要求的追蹤記錄,請前往「Request sent to target server」階段,然後按一下「Show Curl」。
- 系統會開啟「Curl for Request Sent to Target Server」視窗,您可以在其中決定目標伺服器主機別名。
- 檢查 API Proxy 的目標端點,檢查後端伺服器網址或目標伺服器中的主機名稱是否指向其他 Proxy 或您自己的後端伺服器。
- 如果目標伺服器主機別名指向虛擬主機別名,就表示其為 Proxy 鏈結。在這種情況下,您必須針對鏈結 Proxy 重複執行上述所有步驟,直到找出
500 Internal Server Error
真正產生的原因為止。在這種情況下,其他鏈結的 Proxy 可能也會在其他階段發生500 Internal Server Error
,而您可以使用本教戰手冊或 500 內部伺服器錯誤教戰手冊中的指示進行診斷及解決。 - 如果目標伺服器主機別名指向後端伺服器,請前往「Resolution」。
解析度
如果確定 500
錯誤是來自後端伺服器,請與後端伺服器團隊合作進行適當修正。
在上述範例中,您可能必須要求使用者傳遞有效憑證才能修正這個問題。
注意事項
- 您必須先擷取失敗要求的追蹤工作階段,才能查看後端伺服器為
500 Internal Server Error
傳回的實際錯誤訊息。 - 基於安全考量,後端伺服器回應不會記錄在 API Monitoring、NGINX 存取記錄檔或訊息處理器記錄檔。
- 您可以查看後端伺服器記錄,或在後端啟用偵錯模式,藉此取得
500 Internal Server Error
的詳細資料和/或查看後端伺服器傳回的錯誤訊息。
必須收集診斷資訊
如果按照上述指示操作後仍無法解決問題,請收集下列診斷資訊,並與 Apigee Edge 支援團隊聯絡。
如果您是公開雲端使用者,請提供下列資訊:
- 機構組織名稱
- 環境名稱
- API Proxy 名稱
- 完成
curl
指令以重現500
錯誤 - 包含
500 Internal Server Error
要求的追蹤檔 - 如果目前未發生
500
錯誤,請提供過去發生500
錯誤的時間範圍,並提供時區資訊。
如果您是 Private Cloud 使用者,請提供下列資訊:
- 觀察失敗要求的完整錯誤訊息
- 您要觀察到
500
錯誤的機構、環境名稱和 API Proxy 名稱 - API Proxy 套裝組合
- 包含
500 Internal Server Error
要求的追蹤檔 - 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
- 發生
500
錯誤時,包含時區資訊的時間範圍。