503 服务不可用 - NoActiveTarget - HealthCheckFailures

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

视频

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

视频 说明
<ph type="x-smartling-placeholder"></ph> 排查并解决 503 Service Unavailable - NoActiveTargets 问题 了解以下内容: <ph type="x-smartling-placeholder">
    </ph>
  • 目标服务器和健康监视器的重要性
  • 实时排查 503 Service Unavailable 问题并解决相关问题 - NoActiveTargets 由健康检查失败导致的错误

问题

客户端应用收到 HTTP 响应状态代码 503 以及 消息 Service Unavailable 和错误代码 NoActiveTargets

错误消息

您将看到以下错误响应:

HTTP/1.1 503 Service Unavailable
  

您将在 HTTP 响应中看到以下错误消息:

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

可能的原因

通常会观察到包含错误代码 NoActiveTargets 的 HTTP 响应 503 Service Unavailable 在 API 代理的目标端点配置中使用一个或多个目标服务器时。

本指南介绍了 503 Service Unavailable 以及错误代码 由健康检查失败导致的 NoActiveTargets 。 请参阅此手册,了解导致此错误的其他原因。

健康检查失败

仅当您配置了 <ph type="x-smartling-placeholder"></ph> Health Monitor,它们是 API 代理的目标端点中目标服务器负载均衡配置的一部分。

当目标服务器未通过健康检查时,Edge 会递增该服务器的失败计数。 如果该服务器的健康检查失败次数达到预定义的阈值 (<MaxFailures>), 消息处理器会将如下警告消息记录到其日志文件中:

Apigee-Timer-7 WARN  ADAPTORS.HTTP.FLOW - LBServer.incrementFailureCount() : Max failure count(10) reached for server : mocktarget2{Environment=<orgname>__prod,Application=mocktargetapigee__1,Target=default}
    

警告消息提供以下信息。 这有助于您了解哪个目标服务器已达到 MaxFailure 的数量:

  • 目标服务器名称
  • 组织和环境名称
  • API 代理名称
  • 目标端点名称

此后,Edge 会停止向该特定服务器发送任何请求。所有目标 在 LoadBalancer 配置中配置的每台服务器达到 MaxFailure 数量时, 系统将返回 503 Service Unavailable 并返回错误代码 NoActiveTargets.

使用 Health Monitor 可帮助 Apigee Edge 自动将目标服务器重新纳入 进行轮替,而无需重新部署 API 代理。

以下是导致健康检查失败的可能原因:

原因 说明 谁可以执行问题排查步骤
连接超时错误 消息处理器无法在指定的超时时间内连接到目标服务器 。 Edge Private Cloud 用户
非安全端口上的安全请求
  1. 如果目标服务器定义为安全服务器,但却未正确配置 非安全端口
  2. 如果目标服务器定义为安全服务器,但运行状况监控 配置为对非安全端口执行健康检查。
Edge Private Cloud 用户
安全端口上的非安全请求
  1. 如果目标服务器被定义为非安全服务器,但配置不正确 安全端口
  2. 如果目标服务器定义为非安全服务器,但运行状况监控器为 配置为在安全端口上执行健康检查。
Edge Private Cloud 用户
Health Check API 返回错误 如果健康检查 API 返回错误或响应代码, 。 Edge Private Cloud 用户

常见诊断步骤

确定失败请求的消息 ID

跟踪工具

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

  1. 启用跟踪会话, 进行 API 调用,并重现问题 - 503 Service Unavailable,错误代码为 NoActiveTargets
  2. 选择其中一个失败的请求。
  3. 进入 AX 阶段,然后确定消息 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-codemessaging.adaptors.http.flow.NoActiveTargets 出现任何 503 错误, 记下一个或多个此类请求的消息 ID,如以下示例所示:

    显示 503 错误的示例条目

    显示状态代码、消息 ID、故障来源和错误代码的示例条目

常见的错误消息

使用了目标服务器,但在消息处理器尝试 与后端服务器建立连接后,您会在 消息处理器日志。系统会在实际异常/错误消息显示之后记录这些错误 以及之前失败的对话。

在消息处理器日志中观察到的常见错误消息 (/opt/apigee/var/log/edge-message-processor/logs/system.log503 Service Unavailable(错误代码为 NoActiveTargets) 如下:

org:myorg env:prod api:TestTargetServer rev:2 messageid:<messageid>  NIOThread@0 INFO  ADAPTORS.HTTP.FLOW - LBTargetRequestSender.sendRequest() : Failed to send request to target servers : [demo-target] for default{Organization=myorgEnvironment=prod,Application=TestTargetServer__2}

org:myorg env:prod api:TestTargetServer rev:2 messageid:<messageid>  NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - LBTargetRequestSender.sendRequest() : No Active Target server Found for default{Organization=myorgEnvironment=prod,Application=TestTargetServer__2}

org:myorg env:prod api:TestTargetServer rev:2 messageid:<messageid>  NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - LBTargetRequestSender.sendRequest() : Unexpected error while sending request
com.apigee.errors.http.server.ServiceUnavailableException: The Service is temporarily unavailable
	at com.apigee.messaging.adaptors.http.flow.data.LBTargetRequestSender.sendRequest(LBTargetRequestSender.java:299)
	at com.apigee.messaging.adaptors.http.flow.data.LBTargetRequestSender.access$400(LBTargetRequestSender.java:57)
	…<snipped>

这些错误消息表示由于 失败。结果,消息处理器会发出 503 Service Unavailable (以错误代码 NoActiveTargets 作为对客户端的响应)。

原因:连接超时

诊断

  1. 确定失败请求的消息 ID
  2. 在消息处理器日志 (/opt/apigee/var/log/edge-message-processor/logs/system.log) 中搜索消息 ID。
  3. 您会看到 常见错误消息。不过, 要获取健康检查失败的实际原因,请滚动到这些 常见错误消息,并检查是否存在任何 HEALTH MONITOR 错误。

    例如,以下 HEALTH MONITOR 错误消息表示消息处理器出现故障 以及发送健康检查 API 请求时会出现连接超时错误:

    Apigee-Timer-6 ERROR SERVICES.HEALTH_MONITOR - HTTPMonitor.getResponseFromCache() : Error sending request Request URL : https://<BackendServer-Hostname>:443/status
    java.net.ConnectException: Connection timed out (Connection timed out)
    	at java.net.PlainSocketImpl.socketConnect(Native Method)
    	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    	at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    …<snipped>
            

    如果此错误在健康监控器中配置的次数为 MaxFailure, 那么您会看到类似如下的警告消息:

    Apigee-Timer-7 WARN  ADAPTORS.HTTP.FLOW - LBServer.incrementFailureCount() : Max failure count(10) reached for server : mocktarget2{Environment=<orgname>__prod,Application=mocktargetapigee__1,Target=default}
            

    请仔细阅读警告消息中提供的信息。确保 MaxFailure ,而您正为其启用的 API 代理中使用的目标服务器数量已达到 遇到了 503 响应代码(错误代码为 NoActiveTargets)。

  4. 在上面的示例中,健康检查失败并出现 connection timed out 错误。 检查您是否能够直接从每个后端服务器 使用 telnet 命令的消息处理器:
  5. telnet <BackendServer-HostName> 443
          
  6. 如果您能够连接到后端服务器,那么您可能会看到如下消息: 已连接到 backend-server。那么问题可能是暂时性的 问题可能已经得到解决,或者是间歇性问题。重复执行第 4 步几次 (10 次以上)并验证输出结果。
    1. 如果使用 telnet 命令一直都没有错误,则问题是 已解决。重新检查健康检查失败是否已停止。如果是,则您不必 提供进一步帮助
    2. 如果无法使用 telnet 命令间歇性地连接到后端服务器, 则可能是网络问题,或者您的后端服务器可能正忙。
  7. 如果您始终无法使用 telnet 命令连接到后端服务器, 则可能是因为该流量不允许来自特定后端服务器上的消息处理器。

分辨率

如果一直观察到 connection timed out 错误,请确保后端 服务器没有任何防火墙限制,允许来自 Apigee Edge 消息处理器的流量。 例如,在 Linux 上,您可以使用 iptables 允许来自 后端服务器上消息处理器的 IP 地址。

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

原因:非安全端口上的安全请求

诊断

  1. 确定失败请求的消息 ID
  2. 在消息处理器日志 (/opt/apigee/var/log/edge-message-processor/logs/system.log) 中搜索消息 ID。
  3. 您会看到与相应消息 ID 对应的常见错误消息。 不过,如需获取健康检查失败的实际原因,请滚动到这些 常见错误消息,并检查是否存在任何 HEALTH MONITOR 错误。

    例如,您可能会看到如下所示的 HEALTH MONITOR 错误:

    Apigee-Timer-1 ERROR SERVICES.HEALTH_MONITOR - HTTPMonitor.getResponseFromCache() : Error sending request Request URL : https://mocktarget.apigee.net:80/status
    javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
            at sun.security.ssl.InputRecord.handleUnknownRecord(InputRecord.java:710)
            at sun.security.ssl.InputRecord.read(InputRecord.java:527)
            at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:983)
            at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385)
            at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413)
            at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397)
    …<snipped>
            

    如果在健康监控工具中配置此错误的次数达到 MaxFailure 次,您将会看到如下警告消息:

    Apigee-Timer-7 WARN  ADAPTORS.HTTP.FLOW - LBServer.incrementFailureCount() : Max failure count(10) reached for server : mocktarget{Environment=<orgname>__prod,Application=mocktargetapigee__1,Target=default}
            

    请仔细阅读警告消息中提供的信息。确保 MaxFailure 的次数已达到 遇到了 503 响应代码(错误代码为 NoActiveTargets)。

  4. 健康检查失败,错误消息为:
    Error sending request Request URL : https://mocktarget.apigee.net:80/statuscode/200
    javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
          

    错误消息和网址指明了导致此问题的原因是, 安全调用 (HTTPS) 是在非安全端口 80 上进行的。

    在以下两种情况下,可能会发生此错误:

    • 使用非安全端口定义的安全目标服务器
    • 已指定安全目标服务器,但健康监视器配置了非安全端口

    安全目标非安全端口

    场景 1:使用非安全端口定义的安全目标服务器

    如果您定义了一个安全目标服务器,但是使用一个非安全端口(如 80),那么 出错。请按照以下步骤验证是否是导致此问题的原因:

    1. 检查目标端点配置中使用的目标服务器的定义。
    2. 使用 获取 TargetServer API 以获取目标服务器定义。

      目标服务器定义输出

      <TargetServer name="mocktarget">
        <Host>mocktarget.apigee.net</Host>
        <Port>80</Port>
        <IsEnabled>true</IsEnabled>
        <SSLInfo>
            <Enabled>true</Enabled>
        </SSLInfo>
      </TargetServer>
                

      在上面的示例中,定义显示目标服务器 mocktarget 是一个安全的 SSLInfo 块所指示。但是,它配置了非安全端口 80。

    3. 现在,在目标端点配置中检查目标服务器的 Health Monitor 配置:

      运行状况监控器配置

      <HealthMonitor>
        <IsEnabled>true</IsEnabled>
        <IntervalInSec>5</IntervalInSec>
        <HTTPMonitor>
          <Request>
            <ConnectTimeoutInSec>10</ConnectTimeoutInSec>
            <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec>
            <Verb>GET</Verb>
            <Path>/statuscode/200</Path>
          </Request>
          <SuccessResponse>
            <ResponseCode>200</ResponseCode>
          </SuccessResponse>
        </HTTPMonitor>
      </HealthMonitor>
                

      请注意,未在<Port> 上面的健康监控配置。在这种情况下,Edge 的消息处理器使用 。

    4. 根据上述信息,此错误的原因是目标服务器 定义为安全服务器(因为 SSLInfo 块已启用),但是使用非安全端口 80。

    安全目标非安全 HM 端口

    场景 2:定义了安全目标服务器,但健康监控工具配置了非安全端口

    如果您已经定义了一个安全目标服务器,但 Health Monitor 中配置了 非安全端口(例如 80),就会收到此错误。请按照以下步骤进行验证 如果这是导致此问题的原因:

    1. 检查目标端点配置中使用的目标服务器的定义。

      使用 获取 TargetServer API 以获取目标服务器定义。

      目标服务器定义输出

      <TargetServer name="mocktarget">
        <Host>mocktarget.apigee.net</Host>
        <Port>443</Port>
        <IsEnabled>true</IsEnabled>
        <SSLInfo>
            <Enabled>true</Enabled>
        </SSLInfo>
      </TargetServer>
              

      在上面的示例中,定义显示目标服务器 mocktarget 是一个安全服务器,如 SSLInfo 块所示。

    2. 接下来,在目标端点配置中检查目标服务器的 Health Monitor 配置:

      运行状况监控器配置

      <HealthMonitor>
        <IsEnabled>true</IsEnabled>
        <IntervalInSec>5</IntervalInSec>
        <HTTPMonitor>
          <Request>
            <ConnectTimeoutInSec>10</ConnectTimeoutInSec>
         	<SocketReadTimeoutInSec>30</SocketReadTimeoutInSec>
            <Port>80</Port>
            <Verb>GET</Verb>
            <Path>/statuscode/200</Path>
          </Request>
          <SuccessResponse>
            <ResponseCode>200</ResponseCode>
          </SuccessResponse>
        </HTTPMonitor>
              

      在上面的示例中,Health Monitor 配置了非安全端口 80(如 <Port> 元素所示)。

    3. 根据上述信息,此错误的原因是目标服务器定义了 作为安全服务器(因为 SSLInfo 块已启用),并使用安全端口 443,但运行状况监控器 配置为使用非安全端口 80(在 <Port> 元素中指定)执行健康检查。

      也就是说,在此示例中,Edge 将健康检查 API 设置为具有非安全 端口 80 运行,它将失败并显示上述错误。

分辨率

安全目标非安全端口

场景 1:使用非安全端口定义的安全目标服务器

要修正此错误,请更新目标服务器定义,以使用适当的安全端口。

使用 更新 TargetServer API 以更新目标服务器定义,并确保 使用安全端口(例如:443) ,如以下示例所示:

<TargetServer name="mocktarget">
  <Host>mocktarget.apigee.net</Host>
  <Port>443</Port>
  <IsEnabled>true</IsEnabled>
  <SSLInfo>
      <Enabled>true</Enabled>
  </SSLInfo>
</TargetServer>
    

安全目标非安全 HM 端口

场景 2:定义了安全目标服务器,但健康监控工具配置了非安全端口

要修正此错误,请按照以下说明操作:

  1. 将 Health Monitor 配置修改为使用安全端口(例如 443)来执行目标 在发生故障的 API 代理的目标端点配置中检查服务器健康检查,如下所示:
    <HealthMonitor>
      <IsEnabled>true</IsEnabled>
      <IntervalInSec>5</IntervalInSec>
      <HTTPMonitor>
        <Request>
          <ConnectTimeoutInSec>10</ConnectTimeoutInSec>
        <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec>
          <Port>443</Port>
          <Verb>GET</Verb>
          <Path>/statuscode/200</Path>
        </Request>
        <SuccessResponse>
          <ResponseCode>200</ResponseCode>
        </SuccessResponse>
      </HTTPMonitor>
    </HealthMonitor>
            
  2. 保存对 API 代理所做的更改。

原因:安全端口上的非安全请求

诊断

  1. 确定失败请求的消息 ID
  2. 在消息处理器日志 (/opt/apigee/var/log/edge-message-processor/logs/system.log) 中搜索消息 ID。
  3. 您会看到 常见错误消息。 不过,如需获取健康检查失败的实际原因,请滚动到这些 常见错误消息,并检查是否存在任何 HEALTH MONITOR 错误。

    例如,您可能会看到如下所示的 HEALTH MONITOR 错误:

    Apigee-Timer-2 ERROR SERVICES.HEALTH_MONITOR - HTTPMonitor.getResponseFromCache() : Error sending request Request URL : http://mocktarget.apigee.net:443/status
    java.net.SocketException: Unexpected end of file from server
    	at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:851)
    	at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678)
    	at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:848)
    	at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:678)
    	at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1587)
    …<snipped>
              

    如果在健康监控工具中配置此错误的次数达到 MaxFailure 次,您将会看到如下警告消息:

    Apigee-Timer-7 WARN  ADAPTORS.HTTP.FLOW - LBServer.incrementFailureCount() : Max failure count(10) reached for server : mocktarget{Environment=<orgname>__prod,Application=mocktargetapigee__1,Target=default}
              

    请仔细阅读警告消息中提供的信息。确保 MaxFailure 的次数已达到 遇到了 503 响应代码(错误代码为 NoActiveTargets)。

  4. 健康检查失败,错误消息为:
    Error sending request Request URL : http://mocktarget.apigee.net:443/status
    java.net.SocketException: Unexpected end of file from server
          

    错误消息和网址指明了导致此问题的原因是, 非安全调用 (HTTP) 是在安全端口 443 上进行的。

    在以下两种情况下,可能会发生此错误:

    • 使用了安全端口定义的非安全目标服务器
    • 已定义非安全目标服务器,但健康监控工具配置了安全端口

    非安全目标安全端口

    场景 1:使用安全端口定义的非安全目标服务器

    如果您定义了非安全目标服务器,但使用安全端口(如 443), 就会遇到这种错误请按照以下步骤验证是否是导致此问题的原因:

    1. 检查目标端点配置中使用的目标服务器的定义。

      使用 获取 TargetServer API 以获取目标服务器定义。

      目标服务器定义输出

      <TargetServer name="mocktarget">
        <Host>mocktarget.apigee.net</Host>
        <Port>443</Port>
        <IsEnabled>true</IsEnabled>
      </TargetServer>
                    

      在上面的示例中,定义显示目标服务器 mocktarget 因为没有 SSLInfo 块,所以是不安全的服务器。但是,它不正确地 通过安全端口 443 配置

    2. 现在,在目标端点配置中检查目标服务器的 Health Monitor 配置:

      运行状况监控器配置

      <HealthMonitor>
        <IsEnabled>true</IsEnabled>
        <IntervalInSec>5</IntervalInSec>
        <HTTPMonitor>
          <Request>
            <ConnectTimeoutInSec>10</ConnectTimeoutInSec>
            <SocketReadTimeoutInSec>30</SocketReadTimeoutInSec>
            <Verb>GET</Verb>
            <Path>/statuscode/200</Path>
          </Request>
          <SuccessResponse>
            <ResponseCode>200</ResponseCode>
          </SuccessResponse>
        </HTTPMonitor>
      </HealthMonitor>
                      

      请注意,健康监控中未指定 <Port> 元素 配置。在这种情况下,Edge 的消息处理器将使用 目标服务器定义,即 443

    3. 根据上述信息,此错误的原因是目标服务器定义了 作为非安全服务器(因为未定义 SSLInfo 块),但使用安全端口 443。

      也就是说,Edge 通过安全端口 443 通过非安全调用执行健康检查,并且会失败 以及上述错误。

    非安全目标安全 HM 端口

    场景 2:定义了非安全目标服务器,但健康监控工具配置了安全端口

    如果您定义了非安全目标服务器,但 Health Monitor 配置了安全端口(如 443), 就会遇到这种错误请按照以下步骤验证是否是导致此问题的原因:

    1. 检查目标端点配置中使用的目标服务器的定义。

      使用 获取 TargetServer API 以获取目标服务器定义。

      目标服务器定义输出

      <TargetServer name="mocktarget">
        <Host>mocktarget.apigee.net</Host>
        <Port>80</Port>
        <IsEnabled>true</IsEnabled>
      </TargetServer>
              

      在上面的示例中,定义显示目标服务器 mocktarget 是一个非安全服务器 服务器(因为没有 SSLInfo 块)正确配置了非安全端口 80。

    2. 接下来,在目标端点配置中检查目标服务器的 Health Monitor 配置:

      运行状况监控器配置

      <HealthMonitor>
        <IsEnabled>true</IsEnabled>
        <IntervalInSec>5</IntervalInSec>
        <HTTPMonitor>
          <Request>
            <ConnectTimeoutInSec>10</ConnectTimeoutInSec>
         	<SocketReadTimeoutInSec>30</SocketReadTimeoutInSec>
            <Port>443</Port>
            <Verb>GET</Verb>
            <Path>/statuscode/200</Path>
          </Request>
          <SuccessResponse>
            <ResponseCode>200</ResponseCode>
          </SuccessResponse>
        </HTTPMonitor>
      </HealthMonitor>
            

      在上面的示例中,Health Monitor 配置了 <Port> 元素表示的安全端口 443。

    3. 根据上述信息,导致此错误的原因是目标服务器被定义为 一个非安全服务器(因为未定义 SSLInfo 块),并使用非安全端口 80, 但 Health Monitor 已配置为使用安全端口 443(在 <Port> 元素中指定)执行健康检查。

      也就是说,在这种情况下,Edge 会将健康检查设置为使用安全端口 443 的非安全调用,但会失败并显示上述错误。

分辨率

非安全目标安全端口

场景 1:使用安全端口定义的非安全目标服务器

要修正此错误,请更新目标服务器定义,以使用适当的安全端口。

使用 更新 Target Server API 以更新目标服务器定义,并确保 使用非安全端口(例如:80) 如下例所示:

<TargetServer name="mocktarget">
  <Host>mocktarget.apigee.net</Host>
  <Port>80</Port>
  <IsEnabled>true</IsEnabled>
</TargetServer>
              

非安全目标安全 HM 端口

场景 2:定义了非安全目标服务器,但健康监控工具配置了安全端口

要修正此错误,请按照以下说明操作:

  1. 从 Health Monitor 配置中移除 <Port> 元素 或修改健康监控配置以使用非安全端口(例如:80) 在失败的 API 代理的目标端点配置中执行目标服务器健康检查,如下所示:
    <HealthMonitor>
      <IsEnabled>true</IsEnabled>
      <IntervalInSec>5</IntervalInSec>
      <HTTPMonitor>
        <Request>
          <ConnectTimeoutInSec>10</ConnectTimeoutInSec>
       	<SocketReadTimeoutInSec>30</SocketReadTimeoutInSec>
          <Port>80</Port>
          <Verb>GET</Verb>
          <Path>/statuscode/200</Path>
        </Request>
        <SuccessResponse>
          <ResponseCode>200</ResponseCode>
        </SuccessResponse>
      </HTTPMonitor>
    </HealthMonitor>
            
  2. 保存对 API 代理所做的更改。

原因:Health Check API 返回错误

诊断

  1. 确定失败请求的消息 ID
  2. 在消息处理器日志 (/opt/apigee/var/log/edge-message-processor/logs/system.log) 中搜索消息 ID。
  3. 您会看到与相应消息 ID 对应的常见错误消息。 不过,如需获取健康检查失败的实际原因,请滚动到这些 常见错误消息,并检查是否有任何 HEALTH MONITOR 错误/警告。

    例如,您可能会看到如下所示的 HEALTH MONITOR 警告:

    Apigee-Timer-7 INFO  SERVICES.HEALTH_MONITOR - HTTPMonitor.sendRequest() : HTTPMonitor.monitor() : Connecting to https://mocktarget.apigee.net:443/status/200
    Apigee-Timer-7 WARN  SERVICES.HEALTH_MONITOR - HTTPMonitor.monitor() : HTTP response code from health monitoring service does not match.Expected response code : [200]. Received response code : 404
            

    如果在健康监控工具中配置此错误的次数达到 MaxFailure 次,您将会看到如下警告消息:

    Apigee-Timer-7 WARN  ADAPTORS.HTTP.FLOW - LBServer.incrementFailureCount() : Max failure count(10) reached for server : mocktarget{Environment=<orgname>__prod,Application=mocktargetapigee__1,Target=default}
            

    请仔细阅读警告消息中提供的信息。确保 MaxFailure 的次数已达到 遇到了 503 响应代码(错误代码为 NoActiveTargets)。

  4. 健康检查返回了警告消息:
    HTTP response code from health monitoring service does not match.Expected response code : [200]. Received response code : 404
          

    上述警告消息指出,健康检查 API 的预期响应代码为 200, 但实际收到的响应为 404。因此,系统会将这种情况视为失败。

  5. 在调查健康检查 API 错误响应的原因之前,请先确定 Edge 的原因 预计健康检查 API 的响应代码为 200。请查看“健康监控” 在目标端点配置中为目标服务器配置以下配置:

    运行状况监控器配置

    <HealthMonitor>
      <IsEnabled>true</IsEnabled>
      <IntervalInSec>5</IntervalInSec>
      <HTTPMonitor>
        <Request>
          <ConnectTimeoutInSec>10</ConnectTimeoutInSec>
       	<SocketReadTimeoutInSec>30</SocketReadTimeoutInSec>
          <Port>443</Port>
          <Verb>GET</Verb>
          <Path>/status/200</Path>
        </Request>
        <SuccessResponse>
          <ResponseCode>200</ResponseCode>
        </SuccessResponse>
      </HTTPMonitor>
    </HealthMonitor>
            

    请注意,Health Monitor 配置的 <SuccessResponse> 元素下配置了 200 响应代码。 这意味着如果 Edge 从健康检查 API 收到 200 以外的任何响应代码(如 400、401、404、500), 系统就会将其视为错误,并会递增失败次数。

  6. 现在,要调查健康检查 API 给出的错误响应的原因,请按以下步骤操作:
    1. 在消息处理器日志中查看警告消息前面的消息。
      Apigee-Timer-7 INFO  SERVICES.HEALTH_MONITOR - HTTPMonitor.sendRequest() : HTTPMonitor.monitor() : Connecting to https://mocktarget.apigee.net:443/status/200
                

      记下此消息中的健康检查网址。

    2. 您可以从消息处理器直接调用此网址,然后检查实际响应
      curl -i https://mocktarget.apigee.net:443/status/200
                

      上述调用的响应返回 404,如消息处理器日志中所示:

      < HTTP/2 404
                
    3. 这表明,即使直接调用健康检查网址也会失败,并返回相同的响应代码 404。 这意味着健康检查网址可能不正确,或者作为网址一部分被访问的资源已不再可用。
    4. 在上面提供的健康检查 API 示例中,之所以出现此问题,是因为 Health Monitor 配置中使用了不正确的网址。 正确的网址是 https://mocktarget.apigee.net:443/statuscode/200 来自 Mock Target API
  7. 如果您收到任何其他错误响应,请按以下方法确定同一错误的原因: 。如果需要,请与您的后端团队合作。

分辨率

  1. 修复了后端服务器上的健康检查 API 的问题。
  2. 要解决上述示例中的问题,请执行以下操作:
    1. 将 Health Monitor 配置中的 <Path> 元素修改为 /statuscode/200,如下所示:
      <Path>/statuscode/200</Path>
              
    2. 保存 API 代理中的更改。

如果问题仍然存在,请转到 必须收集诊断信息

使用 API 监控来诊断问题

API 监控可帮助您找出问题所在 快速诊断错误、性能和延迟问题及其来源, API 代理、后端目标或 API 平台。

逐步了解示例场景 ,演示了如何使用 API 监控来排查 API 的 5xx 问题。例如: 您可能需要设置提醒,以便在messaging.adaptors.http.flow.NoActiveTargets 超过特定阈值的故障数量。

必须收集的诊断信息

如果按照上述说明操作后问题仍然存在,请收集以下文件 诊断信息。与 Apigee 支持团队联系并分享他们:

  1. 如果您是公有云用户,请提供以下信息:
    1. 组织名称
    2. 环境名称
    3. API 代理名称
    4. 完整 curl 命令以重现该错误
    5. 包含带有 503 Service Unavailable 且错误代码 NoActiveTargets 的请求的跟踪文件
  2. 如果您是 Private Cloud 用户,请提供以下信息: <ph type="x-smartling-placeholder">
      </ph>
    1. 观察到完整的错误消息
    2. 环境名称
    3. API 代理软件包
    4. 包含带有 503 Service Unavailable 且错误代码 NoActiveTargets 的请求的跟踪文件
    5. NGINX 访问日志

      /opt/apigee/var/log/edge-router/nginx/<org>~<env>.<port#>_access_log

    6. 消息处理器日志

      /opt/apigee/var/log/edge-message-processor/logs/system.log