503 Service Unavailable

您正在查看 Apigee Edge 文档。
前往 Apigee X 文档
信息

视频

如需详细了解 503 错误,请观看以下视频:

视频 说明
排查和解决因 DNS 问题导致的 503 服务不可用错误 了解以下内容:
  • Apigee Edge 中由 DNS 解析和网络相关问题导致的“503 服务不可用”错误
  • 排查和解决因 DNS 解析问题而导致的实时 503“服务不可用”错误
排查和解决因网络问题导致的“503 服务不可用”错误 排查并解决由 Apigee Edge 中的网络问题导致的实时 503“服务不可用”错误

问题

客户端应用在 API 代理调用后收到 HTTP 响应状态 503,并显示消息“服务不可用”。

错误消息

您可能会看到以下错误消息:

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 Public 和 Private Cloud 用户
SSL 握手失败 客户端与服务器之间的 TLS/SSL 握手失败。(此类问题的排查方法将在另一主题中介绍。) Edge Public 和 Private Cloud 用户

常见诊断步骤

确定失败请求的消息 ID

Trace 工具

如需使用跟踪工具确定失败请求的消息 ID,请执行以下操作:

  1. 如果问题仍然存在,请为受影响的 API 启用跟踪会话
  2. 进行 API 调用并重现问题 - 503 服务不可用,错误代码为 messaging.adaptors.http.flow.ServiceUnavailable.
  3. 选择其中一个失败的请求。
  4. 前往 AX 阶段,然后在阶段详情部分中向下滚动,确定请求的消息 ID (X-Apigee.Message-ID),如下图所示。

    “阶段详情”部分中的消息 ID

NGINX 访问日志

如需使用 NGINX 访问日志确定失败请求的消息 ID,请执行以下操作:

您还可以参考 NGINX 访问日志来确定 503 错误的 message ID。 如果过去曾发生过该问题或者该问题间歇性发生,并且您无法在界面中捕获跟踪记录,则此功能特别有用。您可以按照以下步骤从 NGINX 访问日志中确定此信息:

  1. 检查 NGINX 访问日志:(/opt/apigee/var/log/edge-router/nginx/ <org>~ <env>.<port#>_access_log)
  2. 搜索特定 API 代理在特定时间段内(如果问题发生在过去)是否有任何 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. 如果 /etc/resolv.conf 中指定的权威 DNS 服务器或名称服务器存在的问题持续存在,则错误/无效的 IP 地址将继续保留在消息处理器的 DNS 缓存中。只要错误 IP 地址存储在消息处理器的 DNS 缓存中,使用特定后端服务器的所有这些 API 的请求都会失败,并显示 503 错误。
    2. 如果 /etc/resolv.conf 中指定的权威 DNS 服务器或名称服务器的问题是间歇性的,那么 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:连接被拒绝错误表示后端服务器拒绝了连接。
      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 地址的访问权限,以允许来自 Edge 消息处理器的流量访问您的后端服务器。例如,在 Linux 上,您可以使用 iptables 允许后端服务器上来自消息处理器 IP 地址的流量。

如果问题仍然存在,请与您的网络管理员合作确定并解决问题。如果您需要 Apigee 提供任何进一步的帮助,请与 Apigee 支持团队联系。

目标服务器主机名不正确

诊断

如果目标服务器中指定的主机名不正确,您可能会收到 503 Service Unavailable 响应,其中包含错误代码 messaging.adaptors.http.flow.ServiceUnavailable.

Trace 工具

如需使用 Trace 工具进行诊断,请执行以下操作:

  1. 如果问题仍然存在,请为受影响的 API 启用跟踪会话
  2. 进行 API 调用并重现问题 - 503 服务不可用,错误代码为 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 代理中使用 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. 然后,您可能会看到一条消息,其中显示消息处理器因“Host not reachable”(主机无法访问)异常而失败。有时,错误消息中会显示主机名:
    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 代理中使用 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 代理中使用的目标服务器定义来确定主机名。
      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 政策来动态生成目标服务器主机名,请调查政策定义和代码,并确保目标服务器主机名生成正确。

SSL 握手失败

我们专门提供了一份问题排查手册,用于解决 TLS/SSL 握手错误。请参阅 SSL 握手失败

确定问题来源

某些类型的错误可能会发生在入站(北向)或出站(南向)连接上。客户端应用与 Edge 之间发生入站(北向)错误。Edge 与后端目标服务器之间发生出站(南向)错误。为了诊断这类问题,您的首要任务是确定错误发生在北向连接还是南向连接上。

了解北向和南向连接

在 Edge 中,您可能会在入站或出站连接中遇到 503“服务不可用”错误:

  • 入站(或北向)连接 - 客户端应用与 Edge 路由器之间的连接。路由器是 Apigee Edge 的一个组件,用于处理向系统发出的传入请求。
  • 出站(或南向)连接 - Edge 消息处理器与后端服务器之间的连接。消息处理器是 Apigee Edge 的一个组件,用于将 API 请求代理到后端目标服务器。

如果您是 Edge Public Cloud 用户,可能不知道路由器或消息处理器等内部组件。公共云用户无法看到或访问这些内部组件。在可能的情况下,我们会提供无需直接访问这些组件即可调查问题的替代方法。

下图展示了 Apigee Edge 的北向和南向连接。

客户端应用(北向连接)通过 Edge 流向后端服务器(南向连接)

确定“503 服务不可用”错误发生的位置

使用以下任一过程来确定 503“服务不可用”错误是发生在北向连接还是南向连接中。

界面轨迹

如需使用界面跟踪记录确定错误发生的位置,请执行以下操作:

  1. 如果问题仍然存在,请为受影响的 API 启用界面轨迹。
  2. 如果失败的 API 请求的界面轨迹显示 503 Service Unavailable 错误发生在目标请求流程期间或由后端服务器发送,则问题出在南向(即消息处理器和后端服务器之间)。
  3. 如果您没有获得特定 API 调用的轨迹,则问题出在客户端应用和路由器之间的北向

API 监控

借助 API 监控,您可以快速找出问题区域,以诊断错误、性能和延迟时间问题及其来源,例如开发者应用、API 代理、后端目标或 API 平台。

逐步了解示例场景,该场景演示了如何使用 API 监控功能排查 API 的 5xx 问题。 例如,您可能希望设置一个提醒,以便在 messaging.adaptors.http.flow.ServiceUnavailable 故障数量超过特定阈值时收到通知。

NGINX 访问日志

如需使用界面跟踪记录确定错误发生的位置,请执行以下操作:

如果过去曾发生过该问题或者该问题间歇性发生,并且您无法捕获跟踪记录,请执行以下步骤:

  1. 检查 NGINX 访问日志 (/opt/apigee/var/log/edge-router/nginx/ org-env.port_access_log)。
  2. 搜索特定 API 代理是否存在任何 503 错误。
  3. 如果您能确定特定 API 在特定时间出现过任何 503 错误,则说明问题出在出站连接(消息处理器与后端服务器之间)。
  4. 如果不是,则问题出在北向连接(客户端应用与路由器之间)。