您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件。 info
影片
如要進一步瞭解如何解決 500 內部伺服器錯誤,請觀看下列影片。
| 影片 | 說明 |
|---|---|
| 簡介 | 簡介 500 Internal Server Error,並說明可能原因。同時展示即時 500 內部伺服器錯誤,以及排解和解決錯誤的步驟。 |
| 處理服務呼叫和擷取變數錯誤 | 示範由服務呼叫和擷取變數政策造成的兩個 500 內部伺服器錯誤,並說明如何排解及解決這些錯誤。 |
| 處理 JavaScript 政策錯誤 | 顯示因 JavaScript 政策而導致的 500 Internal Server Error,以及解決這個錯誤的步驟。 |
| 處理後端伺服器故障 | 顯示後端伺服器故障導致的 500 內部伺服器錯誤範例,並說明解決錯誤的步驟。 |
問題
用戶端應用程式會收到 HTTP 狀態碼 500,以及「Internal Server Error」訊息,做為 API 呼叫的回應。500 Internal Server 錯誤可能是 Edge 執行任何政策時發生錯誤,或是目標/後端伺服器發生錯誤所致。
HTTP 狀態碼 500 是泛用錯誤回應,這表示伺服器發生非預期的狀況,導致無法完成要求。如果沒有其他合適的錯誤代碼,伺服器通常會傳回這個錯誤。
錯誤訊息
你可能會收到下列錯誤訊息:
HTTP/1.1 500 Internal Server Error
在某些情況下,您可能會看到其他錯誤訊息,其中包含更多詳細資料。以下是錯誤訊息範例:
{
"fault":{
"detail":{
"errorcode":"steps.servicecallout.ExecutionFailed"
},
"faultstring":"Execution of ServiceCallout callWCSAuthServiceCallout failed. Reason: ResponseCode 400 is treated as error"
}
}可能原因
500 內部伺服器錯誤可能由多種原因造成。在 Edge 中,錯誤原因可根據錯誤發生位置分為兩大類:
| 原因 | 詳細資料 | 提供詳細的疑難排解步驟 |
| Edge 政策發生執行錯誤 | API Proxy 中的政策可能會因某種原因而失敗。 | Edge 私有和公有雲使用者 |
| 後端伺服器發生錯誤 | 後端伺服器可能會因故發生錯誤。 | Edge 私有和公有雲使用者 |
Edge 政策執行錯誤
API Proxy 中的政策可能會因某些原因而失敗。本節說明如何在執行政策時發生 500 內部伺服器錯誤,排解相關問題。
診斷
私有雲和公有雲使用者的診斷步驟
如果錯誤有追蹤 UI 工作階段,請按照下列步驟操作:
- 確認錯誤是否是由政策執行所致。詳情請參閱「判斷問題來源」。
- 如果錯誤發生在政策執行期間,請繼續。如果錯誤是由後端伺服器所致,請參閱「後端伺服器發生錯誤」。
- 在追蹤記錄中,選取因發生 500 內部伺服器錯誤而失敗的 API 要求。
- 檢查要求,然後選取失敗的特定政策,或追蹤記錄中緊接在失敗政策之後的「Error」流程。
- 如要進一步瞭解錯誤,請查看「屬性」部分下方的「錯誤」欄位或錯誤內容。
- 根據您收集到的錯誤詳細資料,嘗試判斷錯誤原因。
僅適用於私有雲使用者的診斷步驟
如果沒有追蹤記錄 UI 工作階段,請執行下列操作:
- 確認錯誤是否發生在政策執行期間。詳情請參閱「判斷問題來源」。
- 如果錯誤是由政策執行所致,請繼續。如果錯誤發生在政策執行期間,請繼續操作。如果錯誤是由後端伺服器所致,請參閱「後端伺服器發生錯誤」。
- 如「判斷問題來源」一文所述,使用 NGINX 存取記錄判斷 API Proxy 中失敗的政策,以及唯一的要求訊息 ID
- 檢查訊息處理器記錄 (
/opt/apigee/var/log/edge-message-processor/logs/system.log),並在其中搜尋專屬要求訊息 ID。 - 如果找到專屬要求訊息 ID,請查看是否能取得更多失敗原因的相關資訊。
解析度
如果已確定政策問題的原因,請嘗試修正政策並重新部署 Proxy,藉此解決問題。
以下範例說明如何判斷不同類型問題的原因及解決方式。
如果需要進一步協助排解 500 內部伺服器錯誤,或懷疑是 Edge 內的問題,請與 Apigee 支援團隊聯絡。
範例 1:後端伺服器發生錯誤,導致服務呼叫政策失敗
如果服務呼叫政策內的後端伺服器呼叫失敗,且發生 4XX 或 5XX 等錯誤,系統會將其視為 500 內部伺服器錯誤。
- 以下範例顯示後端服務在 Service Callout 政策中發生 404 錯誤。系統會將下列錯誤訊息傳送給使用者:
{ "fault": { "detail": { "errorcode":"steps.servicecallout.ExecutionFailed" },"faultstring":"Execution of ServiceCallout service_callout_v3_store_by_lat_lon failed. Reason: ResponseCode 404 is treated as error" } } } - 下列追蹤 UI 工作階段顯示因服務註解政策發生錯誤而導致的 500 狀態碼:

- 在本例中,「error」屬性會將服務呼叫政策失敗的原因列為「ResponseCode 404 is treated as error」。如果透過服務呼叫政策中的後端伺服器網址存取的資源無法使用,就可能發生這個錯誤。
- 檢查後端伺服器上的資源是否可用。該檔案可能暫時/永久無法存取,或是已移至其他位置。
範例 1 解決方案
- 檢查後端伺服器上的資源是否可用。該檔案可能暫時/永久無法存取,或是已移至其他位置。
- 修正服務呼叫政策中的後端伺服器網址,指向有效且現有的資源。
- 如果資源只是暫時無法使用,請在資源可用時再提出 API 要求。
範例 2:擷取變數政策失敗
現在來看另一個範例,其中 500 內部伺服器錯誤是由「擷取變數」政策中的錯誤所導致,並瞭解如何排解及解決問題。
- UI 工作階段中的下列追蹤記錄顯示 500 狀態碼,這是因為「Extract Variables」政策發生錯誤:

- 選取失敗的「擷取變數」政策,向下捲動並查看「錯誤內容」部分,瞭解更多詳細資料:

- 錯誤內容表示「serviceCallout.oamCookieValidationResponse」變數在「擷取變數」政策中無法使用。如變數名稱所示,這個變數應保留先前服務呼叫政策的回應。
- 在追蹤記錄中選取「Service Callout」政策,您可能會發現「serviceCallout.oamCookieValidationResponse」變數未設定。這表示對後端服務的呼叫失敗,導致回應變數為空白。
- 雖然服務呼叫政策失敗,但由於服務呼叫政策中的「continueOnError」旗標設為 true,因此服務呼叫政策後方的政策會繼續執行,如下所示:
<ServiceCallout async="false" continueOnError="true" enabled="true" name="Callout.OamCookieValidation"> <DisplayName>Callout.OamCookieValidation</DisplayName> <Properties /> <Request clearPayload="true" variable="serviceCallout.oamCookieValidationRequest"> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> </Request> <Response>serviceCallout.oamCookieValidationResponse</Response> <HTTPTargetConnection> <Properties /> <URL>http://{Url}</URL> </HTTPTargetConnection> </ServiceCallout>
- 請注意這項特定 API 要求在追蹤記錄中的專屬訊息 ID「X-Apigee.Message-ID」,如下所示:
- 從要求中選取「記錄的 Analytics 資料」階段。
- 向下捲動,並記下「X-Apigee.Message-ID」的值。

- 查看訊息處理器記錄 (
/opt/apigee/var/log/edge-message-processor/system.log),並搜尋在步驟 6 記下的專屬訊息 ID。針對特定 API 要求,系統觀察到下列錯誤訊息:2017-05-05 07:48:18,653 org:myorg env:prod api:myapi rev:834 messageid:rrt-04984fed9e5ad3551-c-wo-32168-77563 NIOThread@5 ERROR HTTP.CLIENT - HTTPClient$Context.onTimeout() : ClientChannel[C:]@149081 useCount=1 bytesRead=0 bytesWritten=0 age=3002ms lastIO=3002ms .onConnectTimeout connectAddress=mybackend.domain.com/XX.XX.XX.XX:443 resolvedAddress=mybackend.domain.com/XX.XX.XX.XX
上述錯誤表示連線至後端伺服器時發生連線逾時錯誤,導致服務呼叫政策失敗。
- 如要判斷連線逾時錯誤的原因,請從訊息處理器執行 telnet 指令至後端伺服器。telnet 指令傳回「Connection timed out」錯誤,如下所示:
telnet mybackend.domain.com 443 Trying XX.XX.XX.XX... telnet: connect to address XX.XX.XX.XX: Connection timed out
通常在下列情況下會發生這項錯誤:
- 後端伺服器未設定為允許 Edge Message Processor 的流量。
- 如果後端伺服器未監聽特定通訊埠。
在上述範例中,雖然「擷取變數」政策失敗,但實際原因是 Edge 無法連線至「服務呼叫」政策中的後端伺服器。而造成這項錯誤的原因是,後端伺服器未設定為允許 Edge 訊息處理器傳送流量。
您自己的「擷取變數」政策行為會有所不同,且可能因其他原因而失敗。您可以檢查錯誤屬性中的訊息,根據「擷取變數」政策的失敗原因,適當排解問題。
範例 2 解決方案
- 請適當修正「擷取變數」政策中的錯誤或失敗原因。
- 在上圖所示的範例中,解決方法是修正網路設定,允許 Edge 訊息處理器將流量傳送至後端伺服器。方法是在特定後端伺服器上,將訊息處理器的 IP 位址加入許可清單。舉例來說,在 Linux 上,您可以使用 iptables 允許後端伺服器上的訊息處理器 IP 位址傳送流量。
範例 3:JavaCallout 政策失敗
現在再來看一個例子,瞭解 Java Callout 政策發生錯誤導致 500 Internal Server Error 時,如何排解及解決問題。
- 下列 UI 追蹤記錄顯示,由於 Java Callout Policy 發生錯誤,因此出現 500 狀態碼:

- 選取名為「Error」的流程,然後選取失敗的 Java Callout 政策,即可取得錯誤詳細資料,如下圖所示:

- 在本例中,「屬性」部分下的「error」屬性顯示,失敗的原因是在從 JavaCallout 政策連線至 Oracle 資料庫時,使用了過期的密碼。您自己的 Java 呼叫會以不同方式運作,並在 error 屬性中填入不同的訊息。
- 檢查 JavaCallout 政策程式碼,確認需要使用的正確設定。
範例 3:解決方案
請適當修正 Java 呼叫程式碼或設定,以免發生執行階段例外狀況。在上述 Java 呼叫失敗的範例中,使用者必須使用正確的密碼連線至 Oracle 資料庫,才能解決問題。
後端伺服器發生錯誤
500 Internal Server Error 也可能源自後端伺服器。本節說明如何排解後端伺服器造成的錯誤。
診斷
所有使用者的診斷步驟
其他後端錯誤的原因可能大相逕庭。您必須個別診斷每種情況。
- 確認錯誤是否是由後端伺服器所導致。詳情請參閱「判斷問題來源」。
- 如果錯誤是由後端伺服器所致,請繼續操作。如果錯誤發生在政策執行期間,請參閱「Edge 政策執行錯誤」。
- 請視您是否能存取失敗 API 的追蹤工作階段,或後端是否為 Node.js 伺服器,按照下列步驟操作:
如果失敗的 API 呼叫沒有 Trace 工作階段:
- 如果失敗的要求沒有 UI 追蹤記錄,請檢查後端伺服器記錄,瞭解錯誤詳情。
- 如有可能,請在後端伺服器上啟用偵錯模式,進一步瞭解錯誤和原因。
如果失敗的 API 呼叫有 Trace 工作階段:
如果您有追蹤工作階段,請按照下列步驟診斷問題。
- 在「追蹤」工具中,選取因 500 內部伺服器錯誤而失敗的 API 要求。
- 從失敗的 API 要求中選取「Response received from target server」(從目標伺服器收到的回應) 階段,如下圖所示:

- 查看「回應內容」部分,瞭解錯誤詳細資料。

- 在本例中,做為 SOAP 信封的「回應內容」會將錯誤字串顯示為「Not Authorized」(未獲授權) 訊息。這個問題最可能的原因是使用者未將適當的憑證 (使用者名稱/密碼、存取權杖等) 傳遞至後端伺服器。如要修正這個問題,請將正確的憑證傳遞至後端伺服器。
如果後端是 Node.js 伺服器:
- 如果後端是 Node.js 後端伺服器,請在 Edge UI 中檢查特定 API Proxy 的 Node.js 記錄 (公開和私有雲使用者都可以檢查 Node.js 記錄)。如果您是 Edge Private Cloud 使用者,也可以查看訊息處理器記錄 (
/opt/apigee/var/log/edge-message-processor/logs/system.log),進一步瞭解錯誤。
Edge UI 中的 NodeJS 記錄選項 - API Proxy 的「總覽」分頁

解決方法
- 找出錯誤原因後,請在後端伺服器中修正問題。
- 如果是 Node.js 後端伺服器:
- 檢查錯誤是否來自自訂程式碼,並盡可能修正問題。
- 如果錯誤不是來自自訂程式碼,或是需要協助,請聯絡 Apigee 支援團隊。
如果需要進一步協助排解 500 內部伺服器錯誤,或懷疑是 Edge 內的問題,請與 Apigee 支援團隊聯絡。
判斷問題來源
請使用下列其中一種程序,判斷 API Proxy 內或後端伺服器執行政策時,是否擲回 500 Internal Server Error。
在 UI 中使用 Trace
附註:公有雲和私有雲使用者都可以執行本節中的步驟。
- 如果問題仍未解決,請在 UI 中為受影響的 API 啟用追蹤功能。
- 擷取追蹤記錄後,請選取回應代碼為 500 的 API 要求。
- 瀏覽失敗 API 要求的各個階段,並檢查哪個階段傳回 500 Internal Server Error:
- 如果政策執行期間發生錯誤,請參閱「Edge 政策中的執行錯誤」。
- 如果後端伺服器傳回 500 Internal Server,請繼續參閱「後端伺服器發生錯誤」。
使用 API Monitoring
附註:本節中的步驟僅適用於公有雲使用者。
API 監控功能可協助您快速找出問題領域,診斷錯誤、效能和延遲問題及其來源,例如開發人員應用程式、API Proxy、後端目標或 API 平台。
逐步瞭解範例情境,瞭解如何使用 API 監控功能排解 API 的 5xx 問題。
舉例來說,您可以設定快訊,在 500 狀態碼或 steps.servicecallout.ExecutionFailed 故障次數超過特定門檻時收到通知。
使用 NGINX 存取記錄檔
注意:本節中的步驟僅適用於 Edge Private Cloud 使用者。
您也可以參閱 NGINX 存取記錄,判斷 API Proxy 內的政策執行期間或後端伺服器是否擲回 500 狀態碼。如果問題過去曾發生,或是問題間歇性出現,且您無法在 UI 中擷取追蹤記錄,這個方法就特別實用。請按照下列步驟,從 NGINX 存取記錄檔判斷這項資訊:
- 檢查 NGINX 存取記錄 (
/opt/apigee/var/log/edge-router/nginx/ <org>~ <env>.<port#>_access_log)。 - 搜尋特定時間範圍內,特定 API Proxy 是否有任何 500 錯誤。
- 如有任何 500 錯誤,請檢查錯誤是否為政策或目標伺服器錯誤,如下所示:
顯示政策錯誤的範例項目

顯示目標伺服器錯誤的範例項目

- 確認是政策還是目標伺服器錯誤後:
- 如果是政策錯誤,請前往「Edge 政策中的執行錯誤」。
- 如果是目標伺服器錯誤,請前往「後端伺服器發生錯誤」。