503 Service Unavailable

<ph type="x-smartling-placeholder"></ph> 您正在查看 Apigee Edge 文档。
转到 Apigee X 文档
信息

视频

有关 503 错误的详细信息,请观看以下视频:

视频 说明
排查并解决 DNS 导致的 503 服务不可用错误 了解以下内容: <ph type="x-smartling-placeholder">
    </ph>
  • Apigee Edge 中的 DNS 解析和网络相关问题导致的 503 服务不可用错误
  • 排查和解决由 DNS 解析问题引起的实时 503 服务不可用错误
排查并解决由于网络问题导致的 503 服务不可用错误 排查和解决 Apigee Edge 中的网络问题导致的实时 503 服务不可用错误

问题

客户端应用收到 HTTP 响应状态 503 并显示消息服务不可用 执行 API 代理调用

错误消息

您会看到以下错误消息:

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 用户
目标服务器主机名不正确 指定的目标服务器主机不正确或包含不需要的字符(例如空格)。 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),如下图所示。

    “阶段详情”部分中的消息 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-code messages.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 地址。
  6. 在消息处理器日志 (/opt/apigee/var/log/edge-message-processor/logs/system.log) 中搜索包含关键字 DNS 刷新 的消息。检查消息处理器上的 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 服务器或域名服务器的问题持续存在,则错误/无效的 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 消息处理器尝试连接到后端时发生连接错误 出现了以下问题之一:

  • 消息处理器无法在预设的连接超时期限内建立连接。(默认值:3 秒)
  • 后端服务器拒绝连接。

诊断

  1. 确定失败请求的消息 ID。
  2. 在消息处理器日志 (/opt/apigee/var/log/edge-message-processor/logs/system.log) 中搜索特定的请求消息 ID。您可能会发现以下错误: <ph type="x-smartling-placeholder">
      </ph>
    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 命令处理消息处理器: <ph type="x-smartling-placeholder">
      </ph>
    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 服务不可用,错误代码为 messaging.adaptors.http.flow.ServiceUnavailable.
  3. 选择其中一个失败的请求。
  4. 浏览跟踪记录的各个阶段,并找到失败的位置。
  5. 选择出现错误的 FlowInfo。您可以在 error.cause 字段中找到更多信息,如以下示例所示:

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

    在跟踪记录中显示 error.cause 的示例请求
  6. 如果您发现 error.cause 显示 Host not reachable(无法访问主机),则该错误可能是下列原因之一: <ph type="x-smartling-placeholder">
      </ph>
    • 目标服务器/目标端点配置中指定的主机名不正确,或者包含多余的空格或特殊字符。

      例如,主机名中有一个多余的空格,如下所示:
      "demo-target.apigee.net "
                        
    • 在 API 代理中使用 AssignMessage 覆盖 target.url 变量的主机名,或者 JavaScript 政策不正确或包含空格或任何其他不需要的特殊字符。
  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 错误: <ph type="x-smartling-placeholder">
      </ph>
    • 目标服务器/目标端点配置中指定的主机名不正确,或者包含多余的空格或特殊字符。

      例如,主机名“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. 如果您使用任意 AssignMessage/JavaScript 政策动态生成目标服务器主机名,请检查政策定义和代码 并确保正确生成目标服务器主机名。

SSL 握手失败

整个问题排查手册专门用于处理 TLS/SSL 握手错误。请参阅 SSL 握手失败

确定问题根源

某些类型的错误可能发生在传入(北向)或传出(南向)上 连接。客户端应用和 Edge 之间出现传入(北向)错误。一个 Edge 和后端目标服务器之间发生传出(南向)错误。诊断这些 您的第一项任务就是确定错误是发生在北向,还是 南向连接。

了解北向和南向连接

在 Edge 中,您可能会遇到传入或传出连接 503 Service Unavailable 错误:

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

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

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

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

确定 503 服务不可用错误出现的位置

使用以下某个过程确定是否发生了 503 服务不可用错误 建立物理连接。

界面跟踪记录

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

  1. 如果问题仍存在,请为受影响的 API 启用界面跟踪记录。
  2. 如果失败的 API 请求的界面跟踪记录显示 503 服务不可用错误 或由后端服务器发送,则问题 southbound(即消息处理器和后端之间) 服务器)。
  3. 如果您没有获得特定 API 调用的跟踪,那么问题就在于 northbound 在客户端应用和路由器之间。

API 监控

借助 API Monitoring,您可以快速分离问题领域,以诊断错误、性能和延迟问题及其来源。 例如开发者应用、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. 如果不是,则问题出在北向连接上( 客户端应用和路由器)。