<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">
|
问题
客户端应用收到 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 用户 |
非安全端口上的安全请求 |
|
Edge Private Cloud 用户 |
安全端口上的非安全请求 |
|
Edge Private Cloud 用户 |
Health Check API 返回错误 | 如果健康检查 API 返回错误或响应代码, 。 | Edge Private Cloud 用户 |
常见诊断步骤
确定失败请求的消息 ID
跟踪工具
要使用跟踪工具确定失败请求的消息 ID,请执行以下操作:
- 启用跟踪会话, 进行 API 调用,并重现问题 - 503 Service Unavailable,错误代码为 NoActiveTargets。
- 选择其中一个失败的请求。
- 进入 AX 阶段,然后确定消息 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.NoActiveTargets 出现任何 503 错误,
记下一个或多个此类请求的消息 ID,如以下示例所示:
显示 503 错误的示例条目
常见的错误消息
使用了目标服务器,但在消息处理器尝试 与后端服务器建立连接后,您会在 消息处理器日志。系统会在实际异常/错误消息显示之后记录这些错误 以及之前失败的对话。
在消息处理器日志中观察到的常见错误消息
(/opt/apigee/var/log/edge-message-processor/logs/system.log
)
503 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 作为对客户端的响应)。
原因:连接超时
诊断
- 确定失败请求的消息 ID。
- 在消息处理器日志 (
/opt/apigee/var/log/edge-message-processor/logs/system.log
) 中搜索消息 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>
如果此错误在健康监控器中配置的次数为
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)。 - 在上面的示例中,健康检查失败并出现
connection timed out
错误。 检查您是否能够直接从每个后端服务器 使用telnet
命令的消息处理器: - 如果您能够连接到后端服务器,那么您可能会看到如下消息: 已连接到 backend-server。那么问题可能是暂时性的 问题可能已经得到解决,或者是间歇性问题。重复执行第 4 步几次 (10 次以上)并验证输出结果。
- 如果使用
telnet
命令一直都没有错误,则问题是 已解决。重新检查健康检查失败是否已停止。如果是,则您不必 提供进一步帮助 - 如果无法使用
telnet
命令间歇性地连接到后端服务器, 则可能是网络问题,或者您的后端服务器可能正忙。 - 如果您始终无法使用
telnet
命令连接到后端服务器, 则可能是因为该流量不允许来自特定后端服务器上的消息处理器。
telnet <BackendServer-HostName> 443
分辨率
如果一直观察到 connection timed out
错误,请确保后端
服务器没有任何防火墙限制,允许来自 Apigee Edge 消息处理器的流量。
例如,在 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
次,您将会看到如下警告消息: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)。 - 健康检查失败,错误消息为:
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),那么 出错。请按照以下步骤验证是否是导致此问题的原因:
- 检查目标端点配置中使用的目标服务器的定义。
- 现在,在目标端点配置中检查目标服务器的 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 的消息处理器使用 。 - 根据上述信息,此错误的原因是目标服务器 定义为安全服务器(因为 SSLInfo 块已启用),但是使用非安全端口 80。
使用 获取 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 中配置了 非安全端口(例如 80),就会收到此错误。请按照以下步骤进行验证 如果这是导致此问题的原因:
- 检查目标端点配置中使用的目标服务器的定义。
使用 获取 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 配置:
运行状况监控器配置
<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,但运行状况监控器
配置为使用非安全端口 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 配置修改为使用安全端口(例如 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。
- 在消息处理器日志 (
/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
次,您将会看到如下警告消息: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)。 - 健康检查失败,错误消息为:
Error sending request Request URL : http://mocktarget.apigee.net:443/status java.net.SocketException: Unexpected end of file from server
错误消息和网址指明了导致此问题的原因是, 非安全调用 (HTTP) 是在安全端口 443 上进行的。
在以下两种情况下,可能会发生此错误:
- 使用了安全端口定义的非安全目标服务器
- 已定义非安全目标服务器,但健康监控工具配置了安全端口
非安全目标安全端口
场景 1:使用安全端口定义的非安全目标服务器
如果您定义了非安全目标服务器,但使用安全端口(如 443), 就会遇到这种错误请按照以下步骤验证是否是导致此问题的原因:
- 检查目标端点配置中使用的目标服务器的定义。
使用 获取 TargetServer API 以获取目标服务器定义。
目标服务器定义输出
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>443</Port> <IsEnabled>true</IsEnabled> </TargetServer>
在上面的示例中,定义显示目标服务器
mocktarget
因为没有 SSLInfo 块,所以是不安全的服务器。但是,它不正确地 通过安全端口 443 配置。 - 现在,在目标端点配置中检查目标服务器的 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 - 根据上述信息,此错误的原因是目标服务器定义了
作为非安全服务器(因为未定义 SSLInfo 块),但使用安全端口 443。
也就是说,Edge 通过安全端口 443 通过非安全调用执行健康检查,并且会失败 以及上述错误。
非安全目标安全 HM 端口
场景 2:定义了非安全目标服务器,但健康监控工具配置了安全端口
如果您定义了非安全目标服务器,但 Health Monitor 配置了安全端口(如 443), 就会遇到这种错误请按照以下步骤验证是否是导致此问题的原因:
- 检查目标端点配置中使用的目标服务器的定义。
使用 获取 TargetServer API 以获取目标服务器定义。
目标服务器定义输出
<TargetServer name="mocktarget"> <Host>mocktarget.apigee.net</Host> <Port>80</Port> <IsEnabled>true</IsEnabled> </TargetServer>
在上面的示例中,定义显示目标服务器
mocktarget
是一个非安全服务器 服务器(因为没有 SSLInfo 块)正确配置了非安全端口 80。 - 接下来,在目标端点配置中检查目标服务器的 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。 - 根据上述信息,导致此错误的原因是目标服务器被定义为
一个非安全服务器(因为未定义 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:定义了非安全目标服务器,但健康监控工具配置了安全端口
要修正此错误,请按照以下说明操作:
- 从 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>
- 保存对 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
次,您将会看到如下警告消息: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)。 - 健康检查返回了警告消息:
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。请查看“健康监控”
在目标端点配置中为目标服务器配置以下配置:
运行状况监控器配置
<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,如消息处理器日志中所示:
< HTTP/2 404
- 这表明,即使直接调用健康检查网址也会失败,并返回相同的响应代码 404。 这意味着健康检查网址可能不正确,或者作为网址一部分被访问的资源已不再可用。
- 在上面提供的健康检查 API 示例中,之所以出现此问题,是因为 Health Monitor 配置中使用了不正确的网址。
正确的网址是
https://mocktarget.apigee.net:443/statuscode/200
来自 Mock Target API。 - 如果您收到任何其他错误响应,请按以下方法确定同一错误的原因: 。如果需要,请与您的后端团队合作。
分辨率
- 修复了后端服务器上的健康检查 API 的问题。
- 要解决上述示例中的问题,请执行以下操作:
- 将 Health Monitor 配置中的
<Path>
元素修改为/statuscode/200
,如下所示:<Path>/statuscode/200</Path>
- 保存 API 代理中的更改。
如果问题仍然存在,请转到 必须收集诊断信息。
使用 API 监控来诊断问题
API 监控可帮助您找出问题所在 快速诊断错误、性能和延迟问题及其来源, API 代理、后端目标或 API 平台。
逐步了解示例场景
,演示了如何使用 API 监控来排查 API 的 5xx 问题。例如:
您可能需要设置提醒,以便在messaging.adaptors.http.flow.NoActiveTargets
超过特定阈值的故障数量。
必须收集的诊断信息
如果按照上述说明操作后问题仍然存在,请收集以下文件 诊断信息。与 Apigee 支持团队联系并分享他们:
- 如果您是公有云用户,请提供以下信息:
- 组织名称
- 环境名称
- API 代理名称
- 完整 curl 命令以重现该错误
- 包含带有 503 Service Unavailable 且错误代码 NoActiveTargets 的请求的跟踪文件
- 如果您是 Private Cloud 用户,请提供以下信息:
<ph type="x-smartling-placeholder">
- </ph>
- 观察到完整的错误消息
- 环境名称
- API 代理软件包
- 包含带有 503 Service Unavailable 且错误代码 NoActiveTargets 的请求的跟踪文件
- NGINX 访问日志
(
/opt/apigee/var/log/edge-router/nginx/<org>~<env>.<port#>_access_log
) - 消息处理器日志
(
/opt/apigee/var/log/edge-message-processor/logs/system.log
)