503 服務無法使用

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

影片

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

影片 說明
疑難排解及解決因 DNS 問題而導致的 503 Service Unavailable 錯誤 瞭解以下內容:
  • Apigee Edge 中因 DNS 解析和網路相關問題而導致 503 Service Unavailable 錯誤
  • 排解及解決因 DNS 解析問題導致的即時 503 服務無法使用錯誤
排解及解決因網路問題導致的 503 服務無法使用錯誤 排解及解決 Apigee Edge 網路問題導致的即時 503 服務無法使用錯誤

問題

用戶端應用程式在 API Proxy 呼叫後,收到 HTTP 回應狀態 503,並顯示「Service Unavailable」訊息。

錯誤訊息

您可能會看到下列錯誤訊息:

HTTP/1.1 503 Service Unavailable
      

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

服務無法使用

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

可能原因

如果 Apigee Edge 的訊息處理器在與後端伺服器通訊時,因連線逾時、主機名稱不正確或 SSL 交握失敗而發生錯誤,就會出現 HTTP 回應 503 Service Unavailable,並顯示錯誤碼 messaging.adaptors.http.flow.ServiceUnavailable

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

原因 說明 誰可以執行疑難排解步驟
因 DNS 解析錯誤而導致連線錯誤 目標伺服器的 DNS 解析產生錯誤的 IP 位址,導致連線錯誤。 Edge Private Cloud 使用者
連線錯誤 網路或連線問題導致用戶端無法連線至伺服器。 Edge Private Cloud 使用者
目標伺服器主機名稱不正確 指定的目標伺服器主機不正確,或含有不必要的字元 (例如空格)。 Edge 公有和私有雲使用者
SSL 握手失敗 用戶端與伺服器之間的 TLS/SSL 握手失敗。(這類問題的疑難排解方式請參閱其他主題)。 Edge 公有和私有雲使用者

常見的診斷步驟

找出失敗要求訊息的 ID

追蹤工具

如要使用追蹤工具判斷失敗要求的訊息 ID,請按照下列步驟操作:

  1. 如果問題仍未解決,請為受影響的 API 啟用追蹤工作階段
  2. 發出 API 呼叫並重現問題 - 503 Service Unavailable,錯誤代碼為 messaging.adaptors.http.flow.ServiceUnavailable.
  3. 選取其中一個失敗的要求。
  4. 前往 AX 階段,然後在「Phase Details」(階段詳細資料) 區段中向下捲動,找出要求的訊息 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. 如果出現任何 503 錯誤,並顯示 X-Apigee-fault-code messaging.adaptors.http.flow.ServiceUnavailable,請記下其中一或多個要求的訊息 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 位址。
  6. 在訊息處理器記錄 (/opt/apigee/var/log/edge-message-processor/logs/system.log) 中搜尋含有「DNS Refresh」關鍵字的訊息。檢查是否偶爾會將無效或錯誤的 IP 位址新增至訊息處理器的 DNS 快取。
    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. 如果授權 DNS 伺服器或 /etc/resolv.conf 中指定的名稱伺服器有任何問題,後端伺服器主機名稱就會解析為錯誤/無效的 IP 位址。系統隨後會將無效/錯誤的 IP 位址儲存在訊息處理工具的 DNS 快取中。
    1. 如果權威 DNS 伺服器或 /etc/resolv.conf 中指定的名稱伺服器持續發生問題,訊息處理器的 DNS 快取中就會繼續保留錯誤/無效的 IP 位址。只要錯誤的 IP 位址儲存在訊息處理器的 DNS 快取中,使用特定後端伺服器的所有 API 要求都會失敗,並顯示 503 錯誤。
    2. 如果授權 DNS 伺服器或 /etc/resolv.conf 中指定的名稱伺服器發生間歇性問題,DNS 快取就會間歇性儲存良好和不良的 IP 位址。在這種情況下,使用特定後端伺服器的所有 API 都會間歇性發生 503 錯誤。
  9. 如果 DNS 伺服器持續發生問題,您會看到持續失敗的訊息。如果 DNS 伺服器問題是間歇性的,您就會看到間歇性失敗。也就是說,每當後端伺服器主機名稱解析為錯誤的 IP 位址時,您就會看到 503 錯誤。後端伺服器主機名稱解析為正確的 IP 位址時,您就會看到成功的回應。

解析度

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

  1. 如果授權 DNS 伺服器或 /etc/resolv.conf 中指定的名稱伺服器有問題,請修正適當伺服器的問題。
  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 的訊息。如果無法連線至後端伺服器,可能是因為特定後端伺服器未將 Message Processor 的 IP 位址加入許可清單。

解析度

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

如果問題仍未解決,請與網路管理員合作,找出並修正問題。如需 Apigee 的進一步協助,請與 Apigee 支援團隊聯絡。

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

診斷

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

追蹤工具

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

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

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

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

      舉例來說,主機名稱中含有不必要的空格,如下所示:
      "demo-target.apigee.net "
                        
    • API Proxy 中使用 AssignMessageJavaScript 政策,以 target.url 變數覆寫的主機名稱不正確,或含有空格或其他不必要的特殊字元。
  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. 如果看到下列警告/錯誤訊息,表示訊息處理器無法解析主機名稱。由於訊息會暫緩處理,您可能不會看到所有訊息 ID/要求的這則警告訊息。
    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 政策)。
  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 政策動態產生目標伺服器主機名稱,請調查政策定義和程式碼,並確保目標伺服器主機名稱產生正確。

安全資料傳輸層握手失敗

我們提供完整的疑難排解手冊,專門解決 TLS/SSL 握手錯誤。請參閱「安全資料傳輸層握手失敗」。

判斷問題來源

某些類型的錯誤可能會發生在傳入 (北向) 或傳出 (南向) 連線。用戶端應用程式與 Edge 之間發生傳入 (北向) 錯誤。Edge 與後端目標伺服器之間發生輸出 (南向) 錯誤。如要診斷這類問題,首先要找出錯誤是發生在北向或南向連線上。

瞭解北向和南向連線

在 Edge 中,傳入或傳出連線可能會發生 503 服務無法使用錯誤:

  • 連入 (或北向) 連線:用戶端應用程式與 Edge Router 之間的連線。路由器是 Apigee Edge 的元件,負責處理系統收到的要求。
  • 輸出 (或南向) 連線:Edge 訊息處理器與後端伺服器之間的連線。訊息處理器是 Apigee Edge 的元件,可將 API 要求代理至後端目標伺服器。

如果您是 Edge Public Cloud 使用者,可能不瞭解內部元件,例如路由器或訊息處理器。公有雲使用者無法查看或存取這些內部元件。我們會盡可能提供替代方法來調查問題,這些方法不需要直接存取這些元件。

下圖說明 Apigee Edge 的北向和南向連線。

用戶端應用程式 (北向連線) 透過 Edge 連線至後端伺服器 (南向連線) 的流程

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

請使用下列其中一種程序,判斷 503 Service Unavailable 錯誤是否發生在北向或南向連線。

UI 追蹤記錄

如要使用 UI 追蹤功能判斷發生錯誤的位置,請按照下列步驟操作:

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

API 監控

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

逐步瞭解範例情境,瞭解如何使用 API 監控功能排解 API 的 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 錯誤,則問題出在南向連線 (訊息處理器與後端伺服器之間)。
  4. 如果不是,問題就出在北向連線 (用戶端應用程式和路由器之間)。