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

您正在查看 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 診斷錯誤:

  1. 適當角色的使用者 登入 Apigee Edge UI
  2. 切換至您想要調查問題的機構。

  3. 前往「分析」>「API 監控」>「調查」頁面。
  4. 請選取你發現錯誤的特定時間範圍。
  5. 將「Fault Code」與「Time」進行比較。

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

    ( 查看較大圖片)。

  7. 錯誤代碼 messaging.adaptors.http.flow.ErrorResponseCode 的相關資訊如下所示:

    ( 查看較大圖片)。

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

    ( 查看較大圖片)。

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

追蹤記錄

程序 2:使用追蹤工具

如何使用追蹤工具診斷錯誤:

  1. 啟用追蹤工作階段,並採取下列任一做法:
    • 等待發生錯誤代碼 messaging.adaptors.http.flow.ErrorResponseCode500 Internal Server Error 錯誤,或
    • 如果可以重現問題,請透過 API 呼叫來重現問題 500 Internal Server Error
  2. 確保已啟用「Show all FlowInfos」

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

    ( 查看較大圖片)。

  6. 前往追蹤記錄中的「AX」(Analytics (分析) 已記錄) 階段,然後按一下該階段。
  7. 向下捲動至「階段詳細資料回應標頭」區段,確定 X-Apigee-fault-codeX-Apigee-fault-sourceX-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. 如果您是 Private Cloud 使用者,即可使用 NGINX 存取記錄檔來判斷 HTTP 500 Internal Server Error 的重要資訊。
  2. 查看 NGINX 存取記錄檔:

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

  3. 搜尋特定期間內 (問題過去是否發生),或是否有任何要求仍為 500 失敗,且錯誤代碼為 messaging.adaptors.http.flow.ErrorResponseCode500
  4. 如果在 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。您將需要單獨診斷每種情況。

  1. 使用 API 監控、追蹤記錄工具或 NGINX 存取記錄檔,確定 Fault Code、Fult Source 或 NGINX 存取記錄檔,如常見診斷步驟所述。
  2. 如果「Fault Source」target,且「Fault Code」messaging.adaptors.http.flow.ErrorResponseCode,表示後端伺服器傳回錯誤。
  3. 您可以使用下列任一步驟診斷問題原因:

    追蹤記錄

    使用 Trace:

    如果您有 Trace 工作階段的問題,請執行下列步驟:

    1. 在 Trace 中,選取 500 Internal Server Error 失敗的 API 要求。
    2. 在失敗的 API 要求中選取「Responsereceive 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>
      

      在上述回應中,請注意後端伺服器傳送的錯誤訊息「未獲授權」。這表示使用者可能通過了無效的憑證,因此會收到這個錯誤。

    呼叫後端伺服器

    直接呼叫後端伺服器:

    您可以直接呼叫後端伺服器,並:

    • 驗證您透過 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」

    2. 系統會開啟「Curl for Request Sent to Target Server」視窗,您可以在其中決定目標伺服器主機別名。
    3. 檢查 API Proxy 的目標端點,檢查後端伺服器網址或目標伺服器中的主機名稱是否指向其他 Proxy 或您自己的後端伺服器。
    4. 如果目標伺服器主機別名指向虛擬主機別名,就表示其為 Proxy 鏈結。在這種情況下,您必須針對鏈結 Proxy 重複執行上述所有步驟,直到找出 500 Internal Server Error 真正產生的原因為止。在這種情況下,其他鏈結的 Proxy 可能也會在其他階段發生 500 Internal Server Error,而您可以使用本教戰手冊或 500 內部伺服器錯誤教戰手冊中的指示進行診斷及解決。
    5. 如果目標伺服器主機別名指向後端伺服器,請前往「Resolution」

解析度

如果確定 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 錯誤時,包含時區資訊的時間範圍。