500 內部伺服器錯誤 - 後端伺服器

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

影片

影片 說明
500 內部伺服器錯誤 - 由後端造成 示範後端伺服器造成的即時 500 Internal Server Error,以及排解和解決錯誤的步驟。

問題

用戶端應用程式會收到 HTTP 狀態碼 500,以及訊息 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。本手冊說明如何使用常見步驟排解問題,並解決這個錯誤,無論錯誤原因為何。

這個問題的可能原因如下:

原因 說明 適用於以下裝置的疑難排解說明
後端伺服器發生錯誤 後端伺服器可能會因故發生錯誤。 Edge 私有和公有雲使用者

常見的診斷步驟

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

API Monitoring

程序 1:使用 API Monitoring

如要使用 API 監控功能診斷錯誤,請按照下列步驟操作:

  1. 以具備 適當角色的使用者身分登入 Apigee Edge UI
  2. 切換至要調查問題的機構。

  3. 依序前往「Analyze」>「API Monitoring」>「Investigate」頁面。
  4. 選取您觀察到錯誤的特定時間範圍。
  5. 繪製「錯誤代碼」與「時間」的關係圖。

  6. 選取含有故障代碼的儲存格,如下所示: messaging.adaptors.http.flow.ErrorResponseCode

    ( 查看較大圖片)

  7. 故障代碼資訊 messaging.adaptors.http.flow.ErrorResponseCode會顯示如下:

    ( 查看較大圖片)

  8. 按一下「查看記錄」 ,然後展開失敗要求的資料列。

    ( 查看較大圖片)

  9. 在「記錄」視窗中,記下下列詳細資料:
    • 要求訊息 ID
    • 狀態碼: 500
    • 錯誤來源: target
    • 故障代碼: messaging.adaptors.http.flow.ErrorResponseCode

追蹤記錄

程序 #2:使用追蹤工具

如要使用「追蹤」工具診斷錯誤,請按照下列步驟操作:

  1. 啟用「追蹤工作階段」,並選擇下列其中一種做法:
    • 等待發生 500 Internal Server Error 錯誤 (錯誤代碼為 messaging.adaptors.http.flow.ErrorResponseCode),或
    • 如果可以重現問題,請發出 API 呼叫來重現問題 500 Internal Server Error
  2. 確認已啟用「顯示所有流程資訊」

  3. 選取其中一個失敗的要求,然後檢查追蹤記錄。
  4. 瀏覽追蹤記錄的不同階段,找出發生失敗的位置。
  5. 您通常會在「Response received from target server」(從目標伺服器收到回應) 階段之後的流程中發現錯誤,如下所示:

    ( 查看較大圖片)

  6. 在追蹤記錄中前往「AX」(記錄的 Analytics 資料) AX階段,然後按一下。
  7. 向下捲動至「Phase Details Response Headers」部分,判斷「X-Apigee-fault-code」、「X-Apigee-fault-source」和「X-Apigee-Message-ID」的值,如下所示:

    ( 查看較大圖片)

  8. 請記下 X-Apigee-fault-codeX-Apigee-fault-sourceX-Apigee-Message-ID 的值:
  9. 回應標頭
    X-Apigee-fault-code messaging.adaptors.http.flow.ErrorResponseCode
    X-Apigee-fault-source target
    X-Apigee-Message-ID MESSAGE_ID

NGINX

程序 #3:使用 NGINX 存取記錄

如要使用 NGINX 存取記錄診斷錯誤,請按照下列步驟操作:

  1. 如果您是私有雲使用者,可以透過 NGINX 存取記錄判斷 HTTP 500 Internal Server Error 的金鑰資訊。
  2. 檢查 NGINX 存取記錄:

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

  3. 搜尋特定時間內 (如果問題發生在過去) 是否有任何錯誤代碼為 500 的錯誤,或是否有任何要求仍失敗並顯示 500messaging.adaptors.http.flow.ErrorResponseCode
  4. 如果發現任何 500 錯誤,且 X-Apigee-fault-code messaging.adaptors.http.flow.ErrorResponseCode 的值相符,請判斷 X-Apigee-fault-source 的值。

    NGINX 存取記錄檔中的 500 錯誤範例:

    ( 查看較大圖片)

    上述 NGINX 存取記錄檔的範例項目具有下列 X-Apigee-fault-codeX-Apigee-fault-source 值:

    標頭
    X-Apigee-fault-code messaging.adaptors.http.flow.ErrorResponseCode
    X-Apigee-fault-source target

原因:後端伺服器發生錯誤

診斷

後端伺服器傳回的 500 Internal Server Error 可能有許多原因。您必須分別診斷每種情況。

  1. 使用 API 監控、追蹤工具或 NGINX 存取記錄,判斷所觀察到的錯誤的錯誤代碼和錯誤來源,如「常見診斷步驟」一文所述。
  2. 如果「錯誤來源」target,且「錯誤代碼」messaging.adaptors.http.flow.ErrorResponseCode,表示錯誤是由後端伺服器傳回。
  3. 您可以按照下列其中一個步驟診斷問題原因:

    追蹤記錄

    使用追蹤功能:

    如果失敗的項目有追蹤記錄工作階段,請按照下列步驟操作:

    1. 在追蹤記錄中,選取失敗的 API 要求 (500 Internal Server Error)。
    2. 從失敗的 API 要求中選取「Response received from target server」(從目標伺服器收到回應) 階段,如下圖所示:

      ( 查看大圖)

    3. 向下捲動至「階段詳細資料」部分,然後檢查「回應內容」,其中包含後端伺服器的回應。

      回應內容範例:

      <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>

      請注意,在上述回應中,後端伺服器的錯誤訊息為「Not Authorised」。這表示使用者可能傳遞了無效的憑證,因此才會收到這個錯誤訊息。

    呼叫後端伺服器

    直接呼叫後端伺服器:

    您可以直接呼叫後端伺服器,並執行下列操作:

    • 驗證您是否收到與透過 Apigee Edge 發出要求時相同的500 Internal Server Error 回應
    • 檢查從後端伺服器收到的錯誤訊息 (回應)

    請按照下列步驟直接呼叫後端伺服器:

    1. 請確認您已備妥所有必要標頭、查詢參數,以及需要做為要求的一部分傳遞至後端伺服器的任何憑證。
    2. 如果後端服務可公開存取,您可以使用 curl 指令、Postman 或任何其他 REST 用戶端,直接叫用後端伺服器 API。
    3. 如果只能從訊息處理器存取後端伺服器,您可以使用 curl 指令、Postman 或任何其他 REST 用戶端,直接從訊息處理器叫用後端伺服器 API。

    4. 驗證後端服務是否確實傳回 500 Internal Server Error,並檢查後端伺服器傳回的錯誤訊息 (回應),然後判斷此錯誤的原因。

    後端伺服器記錄

    使用後端伺服器記錄

    1. 查看後端伺服器記錄,嘗試取得錯誤和原因的詳細資料。
    2. 如有可能,請在後端伺服器上啟用偵錯模式,進一步瞭解錯誤和原因。
  4. 檢查您是否在失敗的 API Proxy 的特定目標端點中使用 Proxy 鏈結,也就是目標伺服器/目標端點是否在 Apigee Edge 中叫用另一個 Proxy。如要判斷這項資訊,請按照下列步驟操作:

    1. 如果失敗要求有追蹤記錄,請前往「Request sent to target server」(傳送至目標伺服器的要求)階段,然後按一下「Show Curl」(顯示 Curl)

    2. 「Curl for Request Sent to Target Server」(傳送至目標伺服器的 Curl) 視窗隨即開啟,您可以在這個視窗中判斷目標伺服器主機別名。
    3. 檢查 API Proxy 的目標端點,並確認目標伺服器中的後端伺服器網址或主機名稱是否指向其他 Proxy 或您自己的後端伺服器。
    4. 如果目標伺服器主機別名指向虛擬主機別名,則為 Proxy 鏈結。在這種情況下,您需要針對鏈結 Proxy 重複上述所有步驟,直到找出實際導致 500 Internal Server Error 的原因為止。在這些情況下,500 Internal Server Error也可能發生在其他階段的其他鏈結代理伺服器中,可使用本劇本或 500 Internal Server Error 劇本中的說明診斷及解決。
    5. 如果目標伺服器主機別名指向後端伺服器,請前往「解決方法」。

解析度

如果確定 500 錯誤來自後端伺服器,請與後端伺服器團隊合作,適當修正問題。

在上述範例中,您可能必須要求使用者傳遞有效憑證,才能修正這個問題。

注意事項

  1. 只有在擷取失敗要求的追蹤工作階段時,才能查看後端伺服器為 500 Internal Server Error 傳回的實際錯誤訊息。
  2. 基於安全考量,後端伺服器回應不會記錄在 API Monitoring、NGINX 存取記錄或訊息處理器記錄中。
  3. 您可以查看後端伺服器記錄,或在後端啟用偵錯模式,進一步瞭解 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

    說明: ORGENVPORT# 會替換為實際值。

  • 訊息處理器系統記錄 /opt/apigee/var/log/edge-message-processor/logs/system.log
  • 發生 500 錯誤的時間範圍,以及時區資訊。