503 服務無法使用

查看 Apigee Edge 說明文件。
前往 Apigee X說明文件
資訊

影片

如要進一步瞭解 503 錯誤,請觀看以下影片:

影片 說明
疑難排解並解決因 DNS 問題導致 503 服務無法使用錯誤 請參閱下列文章:
  • Apigee Edge 中的 DNS 解析和網路相關問題造成 503 服務無法使用錯誤
  • 排解並解決由 DNS 解析問題造成的即時 503 服務無法使用錯誤
疑難排解並解決因網路問題導致的 503 服務無法使用錯誤 排解及解決 Apigee Edge 中因網路問題導致的即時 503 服務無法使用錯誤

問題

用戶端應用程式收到 HTTP 回應狀態 503Service Unavailable 訊息 都會回應

錯誤訊息

顯示下列錯誤訊息:

HTTP/1.1 503 Service Unavailable
      

您也會在 HTTP 回應中看到下列錯誤訊息:

服務無法使用

{
   "fault": {
      "faultstring": "The Service is temporarily unavailable",
      "detail": {
           "errorcode": "messaging.adaptors.http.flow.ServiceUnavailable"
       }
    }
}
      

可能原因

HTTP 回應 503 Service Unavailable 為錯誤代碼 messaging.adaptors.http.flow.ServiceUnavailable 當 Apigee Edge 的訊息處理器因連線逾時而發生錯誤時,就會發生這個錯誤; 主機名稱,或與後端伺服器通訊時,出現 SSL 握手失敗

出現 503 Service Unavailable 回應的可能原因如下:

原因 說明 誰可以執行疑難排解步驟
DNS 解析有誤導致連線錯誤 目標伺服器的 DNS 解析導致 IP 位址無效,進而導致連線錯誤。 Edge Private Cloud 使用者
連線錯誤 網路或連線問題導致用戶端無法連線至伺服器。 Edge Private Cloud 使用者
目標伺服器主機名稱不正確 指定的目標伺服器主機不正確或含有不需要的字元 (例如空格)。 邊緣公有雲和私有雲使用者
SSL 握手失敗 用戶端和伺服器之間的 TLS/SSL 握手失敗。(本課程的疑難排解 另一個主題會討論此問題)。 邊緣公有雲和私有雲使用者

常見的診斷步驟

找出失敗要求的訊息 ID

追蹤工具

如何使用追蹤工具找出要求失敗的訊息 ID:

  1. 如果問題仍未解決,請為受影響的 API 啟用追蹤工作階段
  2. 發出 API 呼叫並重現問題 - 503 Service 無法使用 (錯誤代碼:messaging.adaptors.http.flow.ServiceUnavailable.)
  3. 請選取其中一個失敗的要求。
  4. 前往「AX 階段」,然後在「階段詳細資料」部分中向下捲動,找出要求的郵件 ID (X-Apigee.Message-ID),如下圖所示。

    「階段詳細資料」部分中的郵件 ID

NGINX 存取記錄

如何使用 NGINX 存取記錄判斷失敗要求的訊息 ID:

您也可以參閱 NGINX 存取記錄,找出 503 錯誤的郵件 ID。 如果過去曾經發生問題或問題持續發生,這項功能就特別實用 ,您也無法在 UI 中擷取追蹤記錄。請按照下列步驟,根據 NGINX 存取記錄判斷這項資訊:

  1. 查看 NGINX 存取記錄:(/opt/apigee/var/log/edge-router/nginx/ <org>~ <env>.<port#>_access_log)
  2. 搜尋特定 API Proxy 在指定期間內是否有 503 錯誤 (如果問題是過去發生),或是仍有 503 要求還是失敗。
  3. 如果 X-Apigee-fault-code message.adaptors.http.flow.ServiceUnavailable 有任何 503 錯誤, 記下一或多個這類要求的郵件 ID,如以下範例所示:

    顯示 503 錯誤的範例項目

    範例項目:顯示狀態碼、訊息 ID、錯誤來源和錯誤程式碼

DNS 解析有誤,發生連線錯誤

診斷

  1. 找出失敗要求的訊息 ID。
  2. 在訊息處理器記錄 (/opt/apigee/var/log/edge-message-processor/logs/system.log) 中搜尋特定要求訊息 ID。您可能會注意到以下錯誤:

    如果發生 onConnectTimeout 錯誤,表示訊息處理器無法在預設的連線逾時期限內 (預設為 3 秒) 連線至後端伺服器。
    2019-08-14 09:11:49,314 org:myorg env:prod api:Employees rev:1 messageid:mo-96cf6757a-9401-21-1 NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context.onTimeout() : ClientChannel[Connected:]@164162 useCount=1 bytesRead=0 bytesWritten=0 age=3001ms lastIO=3001ms .onConnectTimeout connectAddress=www.abc.com/11.11.11.11  resolvedAddress=www.abc.com/22.22.22.22
    
    2019-08-14 09:11:49,333 org:myorg env:prod api:Employees rev:1 messageid:mo-96cf6757a-9401-21-1 NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - RequestWriteListener.onTimeout() : RequestWriteListener.onTimeout(HTTPRequest@6b393600)
          
  3. 請記下 onConnectTimeout 錯誤訊息中的已解析 IP 位址,並檢查該 IP 位址是否適用於後端伺服器。如果 IP 位址有效,請前往「連線錯誤」頁面。
  4. 如果 IP 位址無效,很有可能是因為 DNS 解析問題所造成。
  5. 針對其他失敗的 API 要求重複執行步驟 3 和步驟 4,確認您是否發現相同的 IP 位址或其他無效 IP 位址。
  6. 在訊息處理器記錄 (/opt/apigee/var/log/edge-message-processor/logs/system.log) 中搜尋含有「DNS Refresh」關鍵字的郵件。檢查訊息處理程式的 DNS 快取是否加入錯誤或無效的 IP 位址,可能需時過一段時間,再進行檢查。
    2019-08-14 09:11:49,314 org:myorg env:prod api:Employees rev:1 messageid:mo-96cf6757a-9401-21-1 NIOThread@0 INFO c.a.p.h.d.DNSCachedAddress - DNSCachedAddress.reportDifferences() : DNS Refresh for host: apitarget-uat.schemeweb.co.uk:4436. Added 2 IPs [www.abc.com/22.22.22.22, www.abc.com/33.33.33.33] Removed 1 IPs [www.abc.com/11.11.11.11]
          
  7. 如果權威 DNS 伺服器或 /etc/resolv.conf 中設定的名稱伺服器發生任何問題,就可能發生這個問題。

    一般而言,會設定一或多個權威 DNS 伺服器來執行 DNS 解析。如果沒有權威 DNS 伺服器,會改回使用 /etc/resolv.conf 中的設定,並視情況執行 DNS 解析。例如:如果 /etc/resolv.conf 設為使用特定名稱伺服器,這些名稱伺服器就會用於執行 DNS 解析。
  8. /etc/resolv.conf 中指定的權威 DNS 伺服器或名稱伺服器發生任何問題時,系統會將後端伺服器主機名稱解析為無效/無效的 IP 位址。無效/無效的 IP 位址隨即會儲存在「訊息處理器」的 DNS 快取中。
    1. 如果 /etc/resolv.conf 中指定的權威 DNS 伺服器或名稱伺服器問題持續發生,則訊息處理器的 DNS 快取會繼續保留無效/無效的 IP 位址。只要無效的 IP 位址儲存在訊息處理器的 DNS 快取中,使用特定後端伺服器的所有 API 要求都會失敗,並發生 503 錯誤。
    2. 如果 /etc/resolv.conf 中指定的權威 DNS 伺服器或名稱伺服器發生問題,良好和不良的 IP 位址就會不定期儲存在 DNS 快取中。在這種情況下,針對所有使用指定後端伺服器的 API,會間歇顯示 503 錯誤。
  9. 如果 DNS 伺服器的問題持續發生,就會顯示持續失敗的情形。如果 DNS 伺服器發生斷斷續續的問題,系統就會顯示間歇性失敗。也就是說,當後端伺服器主機名稱解析為無效的 IP 位址時,您就會看到 503 錯誤。當後端伺服器主機名稱解析為良好的 IP 位址後,您就會看到成功的回應。

解析度

請與您的作業系統管理員合作,修正 DNS 伺服器的問題。

  1. 如果 /etc/resolv.conf 中指定的權威 DNS 伺服器或名稱伺服器發生問題,請向相關伺服器修正問題。
  2. 如果在具有訊息處理器的系統中,/etc/resolv.conf 中的設定發生任何問題,請修正設定問題。

連結錯誤

當 Apigee Edge 訊息處理器嘗試連線至後端時,就會發生連線錯誤 發生這類問題:

  • 訊息處理器無法在預設的連線逾時期限內連線。(預設值為 3 秒)
  • 後端伺服器拒絕連線。

診斷

  1. 找出失敗要求的訊息 ID。
  2. 在訊息處理器記錄 (/opt/apigee/var/log/edge-message-processor/logs/system.log) 中搜尋特定要求訊息 ID。您可能會注意到以下錯誤:
    1. onConnectTimeout 錯誤表示訊息處理器無法 在預設的連線逾時期限內,連線至後端伺服器。
      2016-06-23 09:11:49,314 org:myorg env:prod api:Employees rev:1 messageid:mo-96cf6757a-9401-21-1 NIOThread@2 ERROR HTTP.CLIENT - HTTPClient$Context.onTimeout() : ClientChannel[C:]@10 useCount=1 bytesRead=0 bytesWritten=0 age=3001ms lastIO=3001ms .onConnectTimeout connectAddress=www.abc.com/11.11.11.11:80 resolvedAddress=www.abc.com/11.11.11.11
      2016-06-23 09:11:49,333 org:myorg env:prod api:Employees rev:1 messageid:mo-96cf6757a-9401-21-1 NIOThread@2 ERROR ADAPTORS.HTTP.FLOW - RequestWriteListener.onTimeout() : RequestWriteListener.onTimeout(HTTPRequest@6b393600)
      
    2. java.net.ConnectException: Connection refused 錯誤表示連線成功。 已遭後端伺服器拒絕。
      14:40:16.531 +0530
      2016-06-17 09:10:16,531 org:myorg env:prod api:www.abc.com rev:1 rrt07eadn-22739-40983870-15 NIOThread@2 ERROR HTTP.CLIENT - HTTPClient$Context.onConnectFailure() : connect to www.abc.com:11.11.11.11:443 failed with exception {}
      java.net.ConnectException: Connection refused
      at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) ~[na:1.7.0_75]
      at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:739) ~[na:1.7.0_75]
      at com.apigee.nio.ClientChannel.finishConnect(ClientChannel.java:121) ~[nio-1.0.0.jar:na]
      at com.apigee.nio.handlers.NIOThread.run(NIOThread.java:108) ~[nio-1.0.0.jar:na]
      
  3. 檢查您能否直接從各個後端伺服器 使用 telnet 指令的訊息處理器:
    1. 如果後端伺服器解析為單一 IP 位址,請使用下列指令:
      telnet BackendServer-IPaddress 443
                
    2. 如果後端伺服器解析為多個 IP 位址,請使用 將後端伺服器用於 telnet 指令,如下所示:
      telnet BackendServer-HostName 443
                
  4. 如果您能連線至後端伺服器,可能會看到類似 Connected to backend-server 的訊息。如果您無法連線至後端伺服器,可能是因為 因為訊息處理器特定後端的 IP 位址未加入許可清單 伺服器

解析度

將特定後端伺服器上的訊息處理者 IP 位址存取權授予 存取後端伺服器的流量。舉例來說,您可以在 Linux 上使用 iptables,允許來自訊息處理器 IP 位址的流量 在後端伺服器上執行

如果問題持續發生,請與網路管理員合作,判斷並修正 問題。如需 Apigee 的進一步協助,請與 Apigee 支援團隊聯絡。

目標伺服器主機名稱不正確

診斷

如果目標伺服器中指定的主機名稱不正確,您會收到含有錯誤代碼 503 Service Unavailable 的回應。 messaging.adaptors.http.flow.ServiceUnavailable.

追蹤工具

如何使用追蹤工具診斷:

  1. 如果問題仍未解決,請為受影響的 API 啟用追蹤工作階段
  2. 發出 API 呼叫並重現問題 - 503 Service 無法使用 (錯誤代碼:messaging.adaptors.http.flow.ServiceUnavailable.)
  3. 請選取其中一個失敗的要求。
  4. 瀏覽追蹤記錄的各個階段,並找出失敗發生的位置。
  5. 選取發生錯誤的 FlowInfoerror.cause 欄位內有更多資訊,可讓您清楚瞭解失敗的原因,如以下範例所示:

    顯示追蹤記錄中的 error.cause 要求範例

    要求在追蹤記錄中顯示 error.cause 的範例要求
  6. 如果 error.cause 顯示「無法連線至主機」,表示發生錯誤的可能原因如下:
    • 目標伺服器/目標端點設定中指定的主機名稱不正確,或是含有不需要的空格或特殊字元。

      例如,主機名稱包含多餘空間,如下所示:
      "demo-target.apigee.net "
                        
    • API Proxy 中由 target.url 變數覆寫的主機名稱 (使用 AssignMessageJavaScript 政策不正確,或是含有空格或任何其他不需要的特殊字元。
  7. 檢查目標端點設定和/或目標伺服器定義,確認目標伺服器的主機名稱是否有誤,或是含有任何不必要的空格或特殊字元。
  8. 如果是動態建立的目標伺服器主機,請檢查建立目標伺服器主機時採用的政策 (例如 AssignMessage/JavaScript 政策)。勾選 查看目標伺服器的主機名稱是否有誤,或是包含任何不需要的空格或特殊字元。
  9. 決定目標伺服器主機名稱後,請在主機名稱上執行 nslookup/dig 指令,確認能否解析該名稱。

    例如,在具有不空格的主機名稱上執行 nslookup 指令,會傳回下列輸出內容:

    nslookup "demo-target.apigee.net "
    Server:	49.205.75.2
    Address:	49.205.75.2#53
    
    ** server can't find demo-target.apigee.net\032: NXDOMAIN
    
  10. 如果作業系統指令 nslookup 也無法解析主機名稱,那麼問題原因是目標伺服器使用的主機名稱有誤。

    前往「解析度」

訊息處理器記錄

如何使用訊息處理工具記錄檔進行診斷:

  1. 找出失敗要求的訊息 ID
  2. 在訊息處理器記錄中搜尋郵件 ID。(/opt/apigee/var/log/edge-message-processor/logs/system.log)
  3. 如果看到下列警告/錯誤訊息,表示「訊息處理者」無法解析主機名稱。該郵件會延後,因此您可能不會看到 警告訊息。
    org:myorg env:prod api:TestTargetServer rev:2 messageid:<messageid>  NIOThread@0 WARN S.HTTPCLIENTSERVICE - DNSCache$2.failed() : Failed to resolve hostname www.somehost.com . Reason mocktarget.apigee.net : Name or service not known. This log message will snooze for 2 hours
        
  4. 隨後會顯示警告訊息,這時訊息處理器會因為無法連上目標伺服器主機,而將位址從 DNS 快取中移除。
    org:myorg env:prod api:TestTargetServer rev:2 messageid:<messageid> NIOThread@0 WARN  c.a.p.h.d.DNSCachedAddress - DNSCachedAddress.addressNotReachable() : The last address has been removed from Address list null refreshing
        
  5. 接著,系統可能會顯示「訊息處理器」失敗的訊息,並顯示「無法連上主機」這個例外狀況。有時會在錯誤訊息中顯示主機名稱:
    org:myorg env:prod api:TestTargetServer rev:2 messageid:<messageid>  NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context.onConnectFailure() :  connect to demo-target.apigee.net  failed with exception {}
    java.lang.RuntimeException: Host not reachable
    	at com.apigee.protocol.http.HTTPClient$Context.initConnect(HTTPClient.java:704)
    	at com.apigee.protocol.http.HTTPClient$Context.send(HTTPClient.java:675)
    	at com.apigee.messaging.adaptors.http.flow.data.TargetRequestSender.sendRequest(TargetRequestSender.java:234)
    	…<snipped>
        
  6. 有時候,主機名稱可能會顯示 null,因為主機名稱無法解析或連線,如下所示:
    org:myorg env:prod api:TestTargetServer rev:2 messageid:<messageid>  NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context.onConnectFailure() :  connect to null failed with exception {}
    java.lang.RuntimeException: Host not reachable
    	at com.apigee.protocol.http.HTTPClient$Context.initConnect(HTTPClient.java:704)
    	at com.apigee.protocol.http.HTTPClient$Context.send(HTTPClient.java:675)
    	at com.apigee.messaging.adaptors.http.flow.data.TargetRequestSender.sendRequest(TargetRequestSender.java:234)
    	…<snipped>
        
  7. Host not reachable 錯誤通常會在下列任一情況下發生:
    • 目標伺服器/目標端點設定中指定的主機名稱不正確,或是含有不需要的空格或特殊字元。

      例如「demo-target.apigee.net」的主機名稱含有多餘的空間表示:
      NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context.onConnectFailure() :  connect to demo-target.apigee.net  failed with exception
              
    • 在 API Proxy 中,由 AssignMessageJavaScript 政策覆寫的 target.url 變數覆寫主機名稱,或是含有空格或其他不必要的特殊字元。
  8. 透過下列其中一種方式,判斷訊息處理器要透過哪個目標伺服器主機名稱來進行通訊:
    1. 仔細檢查包含「Host not reachable 」的錯誤訊息。
    2. 如果錯誤訊息顯示主機名稱,請複製主機名稱 (包括任何空格或任何特殊字元)。
    3. 如果錯誤訊息顯示主機名稱為「null」,如下錯誤訊息所示,
      org:myorg env:prod api:TestTargetServer rev:2 messageid:<messageid>  NIOThread@0 ERROR HTTP.CLIENT - HTTPClient$Context.onConnectFailure() :  connect to null failed with exception {}
              
      1. 檢查失敗 API Proxy 中使用的目標伺服器定義,確定主機名稱。
      2. 如果目標伺服器主機是以動態方式建立,請檢查建立目標伺服器主機時採用的政策 (例如 AssignMessage/JavaScript policy)。
  9. 決定目標伺服器主機名稱後,請在主機名稱上執行 nslookup/dig 指令,看看是否能解決問題。

    例如,對含有空格的主機名稱執行 nslookup 指令

    nslookup "demo-target.apigee.net "
    Server:	49.205.75.2
    Address:	49.205.75.2#53
    
    ** server can't find demo-target.apigee.net\032: NXDOMAIN
          
  10. 如果作業系統指令 nslookup 無法解析主機名稱,則問題原因是目標伺服器使用的主機名稱有誤。

解析度

  1. 確認在目標端點設定目標伺服器中指定的目標伺服器主機名稱 定義正確,且沒有多餘的空格或特殊字元。
  2. 如果您使用任何 AssignMessage/JavaScript 政策動態產生目標伺服器主機名稱,然後調查政策定義和程式碼 ,確認目標伺服器主機名稱已正確產生。

SSL 握手失敗

整份疑難排解教戰手冊均提供 TLS/SSL 握手錯誤的相關資訊。請參閱 SSL 握手失敗

判斷問題來源

傳入 (北入) 或傳出 (南界) 上可能發生特定類型的錯誤 以獲得最佳效能和最安全的連線用戶端應用程式與 Edge 之間發生傳入 (北界) 錯誤。一個 在 Edge 和後端目標伺服器之間發生傳出 (southbound) 錯誤。若要診斷這些情況 第一項工作是釐清錯誤是發生在北邊,還是 可向外傳入連線

瞭解北向與南向的連線

在 Edge 中,您的傳入或傳出連線發生 503 Service Unavailable 錯誤:

  • 傳入 (或北向) 連線 - 用戶端之間的連線 和 Edge Router 路由器路由器是 Apigee Edge 的元件 將要求傳送至系統的要求
  • 傳出 (或南地) 連線 - 邊緣之間的連線 訊息處理器與後端伺服器。訊息處理器是 Apigee Edge 的一個元件 將 API 要求透過 Proxy 傳送至後端目標伺服器

如果您是 Edge 公用雲端使用者,可能不清楚內部元件,例如: 路由器或訊息處理器使用者無法查看或存取這些內部元件 公有雲使用者我們會盡可能提供其他方式來調查 不需要直接存取這些元件。

下圖說明 Apigee 的北向和南向連線 邊緣

用戶端應用程式 (北界連線) 經過 Edge 到後端伺服器的流程 (南界連線)

判斷發生 503 Service Unavailable 錯誤的位置

請按照下列其中一種程序,判斷是否發生 503 Service Unavailable 錯誤 可交換連線數量

UI 追蹤

使用 UI 追蹤找出錯誤發生的位置:

  1. 如果問題仍未解決,請為受影響的 API 啟用 UI 追蹤記錄。
  2. 如果失敗 API 要求的 UI 追蹤記錄顯示 503 Service Unavailable 錯誤 發生在目標要求流程期間發生,或是由後端伺服器傳送時,問題是 southbound (在訊息處理器與後端之間) 伺服器)。
  3. 如果您沒有取得特定 API 呼叫的追蹤記錄,則表示問題發生 northbound:用戶端應用程式與路由器之間。

API 監控

API Monitoring 可讓您快速找出問題領域,診斷錯誤、效能和延遲問題及其來源。 例如開發人員應用程式、API Proxy、後端目標或 API 平台

逐步完成範例情境,示範如何使用 API Monitoring 排解 5xx 問題。 舉例來說,您可以設定快訊,在「messaging.adaptors.http.flow.ServiceUnavailable」錯誤數量超過特定門檻時接收通知。

NGINX 存取記錄

使用 UI 追蹤找出錯誤發生的位置:

如果問題是過去發生,或是問題間歇發生,導致您無法 擷取追蹤記錄,然後執行下列步驟:

  1. 查看 NGINX 存取記錄 (/opt/apigee/var/log/edge-router/nginx/ org-env.port_access_log)。
  2. 搜尋特定 API Proxy 是否有 503 錯誤。
  3. 如果您在特定時間發現特定 API 的 503 錯誤,則 southbound 連線 (訊息處理器與 用戶端存取資源)。
  4. 如果不是,則問題發生在北行連線 (介於 用戶端應用程式和路由器)。