您正在查看的是 Apigee Edge 文档。
转到 Apigee X 文档。 信息
视频
如需详细了解 503 错误,请观看以下视频:
视频 | 说明 |
---|---|
排查并解决 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 用户 |
针对非安全端口的安全请求 |
|
Edge Private Cloud 用户 |
针对安全端口的非安全请求 |
|
Edge Private Cloud 用户 |
Health Check API 返回错误响应 | 如果健康检查 API 返回错误或响应代码,或者不是 Health Monitor 的 SuccessResponse 元素中指定的任何其他内容。 | Edge Private Cloud 用户 |
常见诊断步骤
确定失败请求的消息 ID
跟踪工具
如需使用跟踪工具确定失败请求的消息 ID,请执行以下操作:
- 启用跟踪会话,发出 API 调用,然后重现问题 - 503 Service Available 及错误代码 NoActiveTarget。
- 选择一个失败的请求。
- 进入 AX 阶段,在 Phase Details(阶段详细信息)部分中向下滚动,确定请求的消息 ID (
X-Apigee.Message-ID
),如下图所示。
NGINX 访问日志
要使用 NGINX 访问日志确定失败请求的消息 ID,请执行以下操作:
您还可以参考 NGINX 访问日志来确定 503 错误的消息 ID。 如果问题是过去发生的,或者问题是间歇性的,并且您无法在界面中捕获跟踪记录,这种方法特别有用。如需通过 NGINX 访问日志确定此信息,请按以下步骤操作:
- 查看 NGINX 访问日志:(
/opt/apigee/var/log/edge-router/nginx/ <org>~ <env>.<port#>_access_log
) - 搜索特定 API 代理在特定时间段内是否存在任何 503 错误(如果问题是在过去发生的),或者是否有任何请求仍然失败并显示 503。
- 如果 X-Apigee-fault-codemessaging.adaptors.http.flow.NoActiveTarget 有任何 503 错误,请记下一个或多个此类请求的消息 ID,如以下示例所示:
显示 503 错误的示例条目
常见的错误消息
如果使用目标服务器,并且在消息处理器尝试与后端服务器连接时发生错误,您将在消息处理器日志中看到一些常见的错误消息。这些错误会记录在导致失败的实际异常/错误消息之后。
在消息处理器日志 (/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 作为对客户端的响应。
原因:连接超时
诊断
- 确定失败请求的消息 ID。
- 在消息处理器日志 (
/opt/apigee/var/log/edge-message-processor/logs/system.log
) 中搜索消息 ID。 - 您将看到与消息 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 的问题。 - 在上面的示例中,健康检查失败并显示
connection timed out
错误。使用telnet
命令检查您能否直接从每个消息处理器连接到特定的后端服务器: - 如果您能够连接到后端服务器,则可能会看到类似于“已连接到后端服务器”的消息。在这种情况下,该问题可能是暂时性问题,它可能会得到解决,也可能属于间歇性问题。重复第 4 步几次(10 次以上)并验证输出。
- 如果
telnet
命令始终没有出现错误,则说明问题已解决。重新检查健康检查失败是否已停止。如果是,您无需执行任何其他操作。 - 如果您无法使用
telnet
命令间歇性连接到后端服务器,则可能是网络存在问题,或者您的后端服务器可能正忙。 - 如果您无法使用
telnet
命令始终如一地连接到后端服务器,则可能是因为不允许来自特定后端服务器上的消息处理器的流量。
telnet <BackendServer-HostName> 443
分辨率
如果一直观察到 connection timed out
错误,请确保后端服务器没有任何防火墙限制,并且允许来自 Apigee Edge Message Processors 的流量。
例如,在 Linux 上,您可以使用 iptables 以允许来自后端服务器上的消息处理器 IP 地址的流量。
如果问题仍然存在,请与您的网络管理员联系以确定并解决问题。 如果您需要 Apigee 的更多帮助,请与 Apigee 支持联系。
原因:不安全的端口上的安全请求
诊断
- 确定失败请求的消息 ID。
- 在消息处理器日志 (
/opt/apigee/var/log/edge-message-processor/logs/system.log
) 中搜索消息 ID。 - 您会看到与消息 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 的问题。 - 健康检查失败,并显示以下错误:
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),则会收到此错误。请按以下步骤操作,确认这是否是导致此问题的原因:
- 检查目标端点配置中使用的目标服务器的定义。
- 现在,检查目标端点配置中目标服务器的 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 调用。 - 根据上述信息,出现此错误的原因是目标服务器被定义为安全服务器(SSLInfo 块已启用),但具有非安全端口 80。
使用 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。安全目标非安全 HM 端口
场景 2:定义了安全目标服务器,但 Health Monitor 配置了不安全的端口
如果您定义了安全的目标服务器,但 Health Monitor 配置了不安全的端口(例如 80),则会收到此错误。请按以下步骤操作,验证这是否是导致此问题的原因:
- 检查目标端点配置中使用的目标服务器的定义。
使用 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 块所示)。 - 接下来,检查目标端点配置中目标服务器的 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>
元素指示)。 - 根据上述信息,出现此错误的原因是:目标服务器被定义为安全服务器(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 配置了不安全的端口
若要修正此错误,请按照以下说明操作:
- 修改 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>
- 保存对 API 代理的更改。
原因:安全端口上的非安全请求
诊断
- 确定失败请求的消息 ID。
- 在消息处理器日志中搜索消息 ID (
/opt/apigee/var/log/edge-message-processor/logs/system.log
)。 - 您将看到与消息 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 的问题。 - 健康检查失败,并显示以下错误:
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),则会收到此错误。请按以下步骤操作,确认这是否是导致此问题的原因:
- 检查目标端点配置中使用的目标服务器的定义。
使用 Get TargetServer API 获取目标服务器定义。
目标服务器定义输出
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>443</Port> <IsEnabled>true</IsEnabled> </TargetServer>
在上面的示例中,定义显示目标服务器
mocktarget
是非安全服务器,因为没有 SSLInfo 块。不过,它未正确配置安全端口 443。 - 现在,检查目标端点配置中目标服务器的 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。 - 根据上述信息,出现此错误的原因是目标服务器被定义为非安全服务器(未定义 SSLInfo 块),但具有安全端口 443。
也就是说,Edge 会使用安全端口 443 进行非安全调用,并失败并显示上述错误。
不安全的目标安全 HM 端口
场景 2:定义了不安全的目标服务器,但 Health Monitor 配置了安全端口
如果您定义了不安全的目标服务器,但 Health Monitor 配置了安全端口(例如 443),则会收到此错误。请按以下步骤操作,确认这是否是导致此问题的原因:
- 检查目标端点配置中使用的目标服务器的定义。
使用 Get TargetServer API 获取目标服务器定义。
目标服务器定义输出
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>80</Port> <IsEnabled>true</IsEnabled> </TargetServer>
在上面的示例中,定义显示目标服务器
mocktarget
是非安全服务器(因为没有 SSLInfo 块),它正确配置了非安全端口 80。 - 接下来,检查目标端点配置中目标服务器的 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>
元素所示。 - 根据上述信息,出现此错误的原因是,目标服务器被定义为具有正确非安全端口 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 配置了安全端口
若要修正此错误,请按照以下说明操作:
- 请从 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>
- 保存对 API 代理的更改。
原因:Health check API 做出响应并返回错误
诊断
- 确定失败请求的消息 ID。
- 在消息处理器日志 (
/opt/apigee/var/log/edge-message-processor/logs/system.log
) 中搜索消息 ID。 - 您会看到与消息 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 的问题。 - 健康检查返回了警告消息:
HTTP response code from health monitoring service does not match.Expected response code : [200]. Received response code : 404
上述警告消息指出,健康检查 API 的预期响应代码为 200,但收到的实际响应为 404。因此,此操作会被视为失败。
- 在调查健康检查 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),系统会将其视为错误,并递增失败计数。 - 现在,如需调查健康检查 API 返回错误响应的原因,请按以下步骤操作:
- 查看消息处理器日志中的警告消息之前的消息。
Apigee-Timer-7 INFO SERVICES.HEALTH_MONITOR - HTTPMonitor.sendRequest() : HTTPMonitor.monitor() : Connecting to https://mocktarget.apigee.net:443/status/200
记下此消息中的健康检查网址。
- 您可以从消息处理器直接调用此网址,然后检查实际响应
curl -i https://mocktarget.apigee.net:443/status/200
上述调用的响应给出了 404,如 Message Processor 日志中所示:
< HTTP/2 404
- 这表明,即使直接调用健康检查网址,也会失败,并显示相同的响应代码 404。这意味着健康检查网址可能不正确,或者作为网址中一部分访问的资源不再可用。
- 在上文提供的健康检查 API 示例中,之所以出现此问题,是因为 Health Monitor 配置中使用了不正确的网址。
在 Mock Target API 中找到了正确的网址:
https://mocktarget.apigee.net:443/statuscode/200
。 - 如果您收到任何其他错误响应,请按照上述步骤确定同样的原因。如有需要,请与您的后端团队合作。
分辨率
- 修复了后端服务器上的健康检查 API 的问题。
- 要解决上述示例中的问题,请执行以下操作:
- 将 Health Monitor 配置中的
<Path>
元素修改为/statuscode/200
,如下所示:<Path>/statuscode/200</Path>
- 保存 API 代理中的更改。
如果问题仍然存在,请转到必须收集诊断信息。
使用 API 监控功能诊断问题
借助 API 监控功能,您可以快速隔离问题区域,以诊断错误、性能和延迟问题及其来源,例如开发者应用、API 代理、后端目标或 API 平台。
通过一个示例场景演示了如何使用 API Monitoring 排查 API 的 5xx 问题。例如,您可能需要设置提醒,以便在 messaging.adaptors.http.flow.NoActiveTargets
故障数量超过特定阈值时收到通知。
必须收集的诊断信息
如果按照上述说明操作后,问题仍然存在,请收集以下诊断信息。请与 Apigee 支持团队联系并分享相关信息:
- 如果您是公有云用户,请提供以下信息:
- 组织名称
- 环境名称
- API 代理名称
- 完成 curl 命令以重现错误
- 跟踪文件,包含带有 503 Service Available 且错误代码 NoActiveTarget 的请求
- 如果您是 Private Cloud 用户,请提供以下信息:
- 观察到了完整的错误消息
- 环境名称
- API 代理软件包
- 跟踪文件,包含带有 503 Service Available 且错误代码 NoActiveTarget 的请求
- NGINX 访问日志
(
/opt/apigee/var/log/edge-router/nginx/<org>~<env>.<port#>_access_log
) - 消息处理器日志
(
/opt/apigee/var/log/edge-message-processor/logs/system.log
)