503 服务不可用 - NoActiveTarget - HealthCheckFailures

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

视频

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

视频 说明
排查并解决“503 服务不可用 - NoActiveTargets”问题 了解以下内容:
  • 目标服务器和健康状况监控器的重要性
  • 排查并解决因健康检查失败而导致的实时 503 服务不可用 - NoActiveTargets 错误

问题

客户端应用会收到 HTTP 响应状态代码 503,其中包含消息 Service Unavailable 和 API 代理请求的错误代码 NoActiveTargets

出错提示

您将看到以下错误响应:

HTTP/1.1 503 Service Unavailable
  

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

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

可能的原因

当您在 API 代理的目标端点配置中使用一个或多个目标服务器时,通常会看到 HTTP 响应 503 Service Unavailable,并带有错误代码 NoActiveTargets

此剧本介绍了因健康检查失败而导致错误代码为 NoActiveTargets503 服务不可用错误。 如需了解此错误的其他原因,请参阅本指南

健康检查失败

只有在 API 代理的目标端点中将 健康状况监控器配置为目标服务器负载均衡配置的一部分时,才会观察到健康检查失败。

当目标服务器未通过健康检查时,Edge 会将该服务器的失败计数加 1。 如果该服务器的健康检查失败次数达到预定义的阈值 (<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 次数,后续 API 请求将收到 503 服务不可用响应,并显示错误代码 NoActiveTargets

使用健康状况监控器有助于 Apigee Edge 在目标服务器恢复正常后自动将其重新纳入轮替中,而无需重新部署 API 代理。

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

原因 说明 谁可以执行问题排查步骤
连接超时错误 消息处理器无法在负载平衡器配置中指定的超时期限内连接到目标服务器。 Edge Private Cloud 用户
在非安全端口上发出安全请求
  1. 如果目标服务器被定义为安全服务器,但错误地配置为非安全端口。
  2. 如果目标服务器被定义为安全服务器,但健康状况监控器配置为在非安全端口上执行健康检查。
Edge Private Cloud 用户
安全端口上的非安全请求
  1. 如果目标服务器被定义为不安全服务器,但错误地配置了安全端口。
  2. 如果目标服务器定义为非安全服务器,但健康状况监控器配置为在安全端口上执行健康检查。
Edge Private Cloud 用户
健康检查 API 响应出现错误 如果健康检查 API 返回错误或响应代码(不是健康监控器 SuccessResponse 元素中指定的任何内容)。 Edge Private Cloud 用户

常见诊断步骤

确定失败请求的消息 ID

Trace 工具

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

  1. 启用轨迹会话,进行 API 调用,并重现问题 - 503 服务不可用,错误代码为 NoActiveTargets
  2. 选择其中一个失败的请求。
  3. 前往 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. 如果存在任何包含 X-Apigee-fault-code messaging.adaptors.http.flow.NoActiveTargets 的 503 错误,请记下此类请求的消息 ID,如下例所示:

    显示 503 错误的条目示例

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

常见出错提示

当使用目标服务器时,如果消息处理器在尝试与后端服务器连接时发生错误,您将在消息处理器日志中看到一些常见错误消息。这些错误是在导致失败的实际异常/错误消息之后记录的。

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

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 服务不可用响应,其中包含错误代码 NoActiveTargets

原因:连接超时

诊断

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

    例如,以下健康监控器错误消息表明,消息处理器在发出健康检查 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}
            

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

  4. 在上面的示例中,健康检查失败,并显示 connection timed out 错误。 使用 telnet 命令检查您是否能够从每个消息处理器直接连接到特定的后端服务器:
  5. telnet <BackendServer-HostName> 443
          
  6. 如果您能够连接到后端服务器,则可能会看到类似 Connected to 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 对应的常见错误消息。 不过,如需了解健康检查失败的实际原因,请向上滚动到这些常见错误消息,并检查是否存在任何健康监控器错误。

    例如,您可能会看到如下所示的健康状况监控器错误:

    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}
            

    请仔细阅读警告消息中提供的信息。确保特定 API 代理中使用的目标服务器已达到 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?
          

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

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

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

    保护目标非安全端口

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

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

    1. 检查目标端点配置中使用的目标服务器的定义。
    2. 使用 Get 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. 现在,检查目标端点配置中目标服务器的健康状况监控器配置:

      健康监控器配置

      <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 的消息处理器会使用目标服务器定义中指定的端口 (80) 来进行健康检查 API 调用。

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

    保护目标非安全 HM 端口

    情形 2:定义了安全目标服务器,但健康监控器配置了不安全的端口

    如果您定义了安全目标服务器,但健康状况监控器配置了不安全的端口(例如 80),则会收到此错误。请按照以下步骤验证这是否是导致此问题的原因:

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

      使用 Get 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. 接下来,在目标端点配置中检查目标服务器的健康状况监控器配置:

      健康监控器配置

      <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>
              

      在上面的示例中,健康状况监控器配置为使用不安全的端口 80,如 <Port> 元素所示。

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

      也就是说,在这种情况下,Edge 会通过不安全的端口 80 将健康检查 API 作为安全调用,并因上述错误而失败。

分辨率

保护目标非安全端口

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

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

使用 Update a 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. 修改健康状况监控器配置,以使用安全端口(例如: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. 您将看到与消息 ID 对应的常见错误消息。 不过,如需了解健康检查失败的实际原因,请向上滚动到这些常见错误消息,并检查是否存在任何健康监控器错误。

    例如,您可能会看到如下所示的健康状况监控器错误:

    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}
              

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

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

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

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

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

    不安全的目标安全端口

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

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

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

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

      目标服务器定义输出

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

      在上面的示例中,定义显示目标服务器 mocktarget 是不安全的服务器,因为没有 SSLInfo 块。不过,它配置有误,使用了安全的端口 443。

    2. 现在,检查目标端点配置中目标服务器的健康状况监控器配置:

      健康监控器配置

      <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:定义了不安全的目标服务器,但健康状况监控器配置了安全端口

    如果您定义了不安全的目标服务器,但健康监控器配置了安全端口(例如 443),则会收到此错误。请按照以下步骤验证这是否是导致此问题的原因:

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

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

      目标服务器定义输出

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

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

    2. 接下来,在目标端点配置中检查目标服务器的健康状况监控器配置:

      健康监控器配置

      <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>
            

      在上面的示例中,健康状况监控器配置为使用安全的端口 443,如 <Port> 元素所示。

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

      也就是说,在这种情况下,Edge 会通过安全端口 443 以非安全调用的方式进行健康检查,并因上述错误而失败。

分辨率

不安全的目标安全端口

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

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

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

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

不安全的目标安全 HM 端口

情形 2:定义了不安全的目标服务器,但健康状况监控器配置了安全端口

如需修正此错误,请按以下说明操作:

  1. 从健康状况监控器配置中移除 <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 代理所做的更改。

原因:健康检查 API 响应出现错误

诊断

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

    例如,您可能会看到如下所示的健康监控器警告:

    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}
            

    请仔细阅读警告消息中提供的信息。确保特定 API 代理中使用的目标服务器已达到 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>
            

    请注意,健康状况监控器配置是在 <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 示例中,问题是因为健康监控器配置中使用了错误的网址而导致的。 正确的网址为 https://mocktarget.apigee.net:443/statuscode/200,来自 Mock Target API
  7. 如果您收到任何其他错误响应,请按照上述步骤确定相应原因。如有需要,请与后端团队合作。

分辨率

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

如果问题仍然存在,请前往必须收集的诊断信息

使用 API 监控诊断问题

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

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

必须收集的诊断信息

如果按照上述说明操作后问题仍然存在,请收集以下诊断信息。联系 Apigee 支持团队并向其提供以下信息:

  1. 如果您是公共云用户,请提供以下信息:
    1. 组织名称
    2. 环境名称
    3. API 代理名称
    4. 用于重现错误的完整 curl 命令
    5. 包含以下内容的轨迹文件:具有 503“服务不可用”错误且错误代码为 NoActiveTargets 的请求
  2. 如果您是私有云用户,请提供以下信息:
    1. 观察到的完整错误消息
    2. 环境名称
    3. API 代理软件包
    4. 包含以下内容的轨迹文件:具有 503“服务不可用”错误且错误代码为 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