503 服务不可用 - NoActiveTarget - HealthCheckFailures

您正在查看的是 Apigee Edge 文档。
转到 Apigee X 文档
信息

视频

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

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

问题

对于 API 代理请求,客户端应用收到 HTTP 响应状态代码 503 以及消息 Service Disabled 和错误代码 NoActiveTarget

错误消息

您将看到以下错误响应:

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 Disabled 以及错误代码 NoActiveTarget

本 playbook 介绍了 503 Service Available 以及因健康检查失败而导致的错误代码 NoActiveTarget。请参阅本指南,了解导致此错误的其他原因。

健康检查失败

只有当您在 API 代理的目标端点中的目标服务器负载均衡配置中配置了 Health Monitor 时,系统才会观察到健康检查失败的情况。

当目标服务器未通过健康检查时,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 计数后,后续 API 请求将返回 503 Service Disabled 并返回错误代码 NoActiveTarget.

使用 Health Monitor 可帮助 Apigee Edge 在目标服务器运行状况良好时自动将其重新纳入轮替中,而无需重新部署 API 代理。

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

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

常见诊断步骤

确定失败请求的消息 ID

跟踪工具

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

  1. 启用跟踪会话,发出 API 调用,然后重现问题 - 503 Service Available 及错误代码 NoActiveTarget
  2. 选择一个失败的请求。
  3. 进入 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.NoActiveTarget 有任何 503 错误,请记下一个或多个此类请求的消息 ID,如以下示例所示:

    显示 503 错误的示例条目

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

常见的错误消息

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

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

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 Available 和错误代码 NoActiveTarget 作为对客户端的响应。

原因:连接超时

诊断

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

    如果此错误重复在 Health Monitor 中配置 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. 如果您能够连接到后端服务器,则可能会看到类似于“已连接到后端服务器”的消息。在这种情况下,该问题可能是暂时性问题,它可能会得到解决,也可能属于间歇性问题。重复第 4 步几次(10 次以上)并验证输出。
    1. 如果 telnet 命令始终没有出现错误,则说明问题已解决。重新检查健康检查失败是否已停止。如果是,您无需执行任何其他操作。
    2. 如果您无法使用 telnet 命令间歇性连接到后端服务器,则可能是网络存在问题,或者您的后端服务器可能正忙。
  7. 如果您无法使用 telnet 命令始终如一地连接到后端服务器,则可能是因为不允许来自特定后端服务器上的消息处理器的流量。

分辨率

如果一直观察到 connection timed out 错误,请确保后端服务器没有任何防火墙限制,并且允许来自 Apigee Edge Message Processors 的流量。 例如,在 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 次在 Health Monitor 中配置的次数,您将看到如下所示的警告消息:

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

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

    • 使用非安全端口定义的安全目标服务器
    • 定义了安全目标服务器,但 Health Monitor 配置了不安全的端口

    安全目标非安全端口

    场景 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. 现在,检查目标端点配置中目标服务器的 Health Monitor 配置:

      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>
                

      请注意,上面的 Health Monitor 配置中未指定 <Port> 元素。在此情况下,边缘的消息处理器使用目标服务器定义中指定的端口(即 80)进行健康检查 API 调用。

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

    安全目标非安全 HM 端口

    场景 2:定义了安全目标服务器,但 Health Monitor 配置了不安全的端口

    如果您定义了安全的目标服务器,但 Health Monitor 配置了不安全的端口(例如 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. 接下来,检查目标端点配置中目标服务器的 Health Monitor 配置:

      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,但 Health Monitor 被配置为通过非安全端口 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:定义了安全目标服务器,但 Health Monitor 配置了不安全的端口

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

  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. 在消息处理器日志中搜索消息 ID (/opt/apigee/var/log/edge-message-processor/logs/system.log)。
  3. 您将看到与消息 ID 对应的常见错误消息。 不过,如需了解健康检查失败的实际原因,请滚动到这些常见错误消息上方,并检查是否有任何 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 次在 Health Monitor 中配置的次数,您将看到如下所示的警告消息:

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

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

    • 使用安全端口定义的非安全目标服务器
    • 定义了不安全的目标服务器,但 Health Monitor 配置了安全端口

    不安全的目标安全端口

    场景 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. 现在,检查目标端点配置中目标服务器的 Health Monitor 配置:

      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>
                      

      请注意,上面的 Health Monitor 配置中未指定 <Port> 元素。在这种情况下,边缘的消息处理器将使用目标服务器定义中指定的端口 443。

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

      也就是说,Edge 会使用安全端口 443 进行非安全调用,并失败并显示上述错误。

    不安全的目标安全 HM 端口

    场景 2:定义了不安全的目标服务器,但 Health Monitor 配置了安全端口

    如果您定义了不安全的目标服务器,但 Health Monitor 配置了安全端口(例如 443),则会收到此错误。请按以下步骤操作,确认这是否是导致此问题的原因:

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

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

      目标服务器定义输出

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

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

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

      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 配置了安全端口 443,如 <Port> 元素所示。

    3. 根据上述信息,出现此错误的原因是,目标服务器被定义为具有正确非安全端口 80 的非安全服务器(未定义 SSLInfo 块),但 Health Monitor 已配置为通过安全端口 443(在 <Port> 元素中指定)执行健康检查。

      也就是说,Edge 会使用安全端口 443 进行非安全调用,并失败并显示上述错误。

分辨率

不安全的目标安全端口

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

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

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

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

不安全的目标安全 HM 端口

场景 2:定义了不安全的目标服务器,但 Health Monitor 配置了安全端口

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

  1. 请从 Health Monitor 配置中移除 <Port> 元素,或者修改 Health Monitor 配置以使用非安全端口(例如: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 次在 Health Monitor 中配置的次数,您将看到如下所示的警告消息:

    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 的原因。为此,请检查目标端点配置中目标服务器的 Health Monitor 配置:

    Health Monitor 配置

    <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,如 Message Processor 日志中所示:

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

分辨率

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

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

使用 API 监控功能诊断问题

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

通过一个示例场景演示了如何使用 API Monitoring 排查 API 的 5xx 问题。例如,您可能需要设置提醒,以便在 messaging.adaptors.http.flow.NoActiveTargets 故障数量超过特定阈值时收到通知。

必须收集的诊断信息

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

  1. 如果您是公有云用户,请提供以下信息:
    1. 组织名称
    2. 环境名称
    3. API 代理名称
    4. 完成 curl 命令以重现错误
    5. 跟踪文件,包含带有 503 Service Available 且错误代码 NoActiveTarget 的请求
  2. 如果您是 Private Cloud 用户,请提供以下信息:
    1. 观察到了完整的错误消息
    2. 环境名称
    3. API 代理软件包
    4. 跟踪文件,包含带有 503 Service Available 且错误代码 NoActiveTarget 的请求
    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)