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 Available,错误代码为 messaging.adaptors.http.flow.ServiceUnavailable

导致 503 Service Available 响应的可能原因包括:

原因 说明 谁可以执行问题排查步骤
由于 DNS 解析不正确而导致的连接错误 目标服务器的 DNS 解析导致了错误的 IP 地址,进而导致连接错误。 Edge Private Cloud 用户
连接错误 网络或连接问题会导致客户端无法连接到服务器。 Edge Private Cloud 用户
目标服务器主机名不正确 指定的目标服务器主机不正确或包含多余的字符(例如空格)。 Edge 公有云和私有云用户
SSL 握手失败 客户端与服务器之间的 TLS/SSL 握手失败。(如需了解此类问题的问题排查方法,请参阅单独的主题。) Edge 公有云和私有云用户

常见诊断步骤

确定失败请求的消息 ID

跟踪工具

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

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

    “Stage Details”(阶段详细信息)部分中的消息 ID

NGINX 访问日志

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

您还可以参考 NGINX 访问日志来确定 503 错误的消息 ID。 如果问题是过去发生的,或者问题是间歇性的,并且您无法在界面中捕获跟踪记录,这种方法特别有用。如需通过 NGINX 访问日志确定此信息,请按以下步骤操作:

  1. 查看 NGINX 访问日志:(/opt/apigee/var/log/edge-router/nginx/ <org>~ <env>.<port#>_access_log)
  2. 搜索特定 API 代理在特定时间段内是否存在任何 503 错误(如果问题是在过去发生的),或者是否有任何请求仍然失败并显示 503。
  3. 如果 X-Apigee-fault-codemessaging.adaptors.http.flow.ServiceAvailable 出现任何 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 地址。
  6. 在 Message Processor 日志 (/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. 如果 /etc/resolv.conf 中指定的权威 DNS 服务器或域名服务器存在任何问题,系统会将后端服务器主机名解析为错误/无效的 IP 地址。然后,不良/无效的 IP 地址将会存储在消息处理器的 DNS 缓存中。
    1. 如果 /etc/resolv.conf 中指定的权威 DNS 服务器或域名服务器问题持续存在,则错误/无效的 IP 地址将继续保留在消息处理器的 DNS 缓存中。只要将错误的 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 Message Processor 尝试连接到后端服务器并出现以下问题之一时,会发生连接错误:

  • 消息处理器无法在预设的连接超时期限内连接。(默认值: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 Disallow 响应,错误代码为 messaging.adaptors.http.flow.ServiceUnavailable.

跟踪工具

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

  1. 如果问题仍未解决,请为受影响的 API 启用跟踪会话
  2. 进行 API 调用并重现问题 - 503 服务不可用,错误代码为 messaging.adaptors.http.flow.ServiceUnavailable.
  3. 选择一个失败的请求。
  4. 浏览跟踪记录的各个阶段,并找到失败的位置。
  5. 选择出现错误的 FlowInfo。您可以在 error.cause 字段中找到更多信息,了解失败的原因,如以下示例所示:

    在跟踪记录中显示 error.cause 的示例请求

    在跟踪记录中显示 error.cause 的示例请求
  6. 如果您发现 error.cause 显示无法访问主机,那么导致此错误的可能原因包括:
    • 目标服务器/目标端点配置中指定的主机名不正确,或者包含多余的空格或特殊字符。

      例如,主机名中有一个多余的空格,如下所示:
      "demo-target.apigee.net "
                        
    • API 代理中的 target.url 变量使用 AssignmentMessageJavaScript 政策覆盖的主机名不正确,或者包含空格或任何其他不需要的特殊字符。
  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 代理中的 target.url 变量使用 assignMessageJavaScript 政策覆盖的主机名不正确,或者包含空格或任何其他多余的特殊字符。
  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. 如果您使用任何 AssignmentMessage/JavaScript 政策动态生成目标服务器主机名,请调查政策定义和代码,并确保正确生成目标服务器主机名。

SSL 握手失败

一整套问题排查策略方案专门用于解决 TLS/SSL 握手错误。请参阅 SSL 握手失败

确定问题的根源

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

了解北向和南向连接

在 Edge 中,您在传入或传出连接上都可能会遇到 503 服务不可用错误:

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

如果您是 Edge 公有云用户,可能不了解路由器或消息处理器等内部组件。公有云用户看不到或访问这些内部组件。我们会尽可能提供其他方法来调查不需要直接访问这些组件的问题。

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

客户端应用(北向连接)通过边缘到后端服务器的流程(南向连接)

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

使用以下任一过程确定在北向连接或南向连接是否发生 503 服务不可用错误。

界面跟踪记录

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

  1. 如果问题仍然存在,请为受影响的 API 启用界面跟踪记录。
  2. 如果失败的 API 请求的界面跟踪记录显示“503 服务不可用”错误发生在目标请求流期间或由后端服务器发送,则表示问题为南向(即消息处理器和后端服务器之间)。
  3. 如果您没有获取特定 API 调用的跟踪记录,则说明客户端应用与路由器之间的问题属于北向问题。

API 监控

借助 API 监控功能,您可以快速隔离有问题的方面,从而诊断错误、性能和延迟问题及其来源,例如开发者应用、API 代理、后端目标或 API 平台。

通过一个示例场景演示了如何使用 API Monitoring 排查 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. 如果不能,则表示问题发生在北向连接(客户端应用与路由器之间的连接)上。