<ph type="x-smartling-placeholder"></ph>
您正在查看 Apigee Edge 文档。
转到
Apigee X 文档。 信息
问题
客户端应用将收到 HTTP 状态代码 502 以及消息 “Bad Gateway”作为对 API 调用的响应。
HTTP 状态代码 502 表示客户端未收到来自 实际应执行请求的后端服务器
错误消息
客户端应用将获得以下响应代码:
HTTP/1.1 502 Bad Gateway
此外,您可能还会看到以下错误消息:
<html> <head> <title>Error</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>An error occurred.</h1> <p>Sorry, the page you are looking for is currently unavailable.<br/> Please try again later.</p> </body> </html>
如果错误来自后端服务器,您可能会看到类似下图的内容。后端的错误消息完全取决于其实现。
<html> <head><title>502 Bad Gateway</title></head> <body bgcolor="white"> <center><h1>502 Bad Gateway</h1></center> </body> </html>
可能的原因
以下几个可能的原因会导致通过 Apigee Edge 运行的 API 出现 502 Bad Gateway 错误:
原因 | 说明 | 适用的问题排查说明 |
池中没有可用的 MP | 如果池中的所有 MP 都不可用,即它们已中断或忙碌,因此无响应,则会观察到此错误。 | Edge Private Cloud 用户 |
路由器和 MP 之间的 SSL 配置不正确 | 如果客户端的 CA 签名的根证书在 Edge 路由器的信任库中缺失,就会出现此错误。 | Edge Private Cloud 用户 |
后端服务器出现错误 | 如果后端服务器出现故障并发送此响应,就会观察到此错误。 | Edge 公有云和私有云用户 |
原因:池中没有 MP
如果路由器发现指定区域/数据中心内的所有消息处理器均不可用(例如,如果它们全部关闭),就会出现此错误。
Apigee Edge 的配置方式是,指定区域/数据中心的传入 API 流量(请求)始终从路由器路由到同一区域/数据中心内的消息处理器 (MP)。在某些情况下,Apigee Edge 组件可能仅在一个区域/数据中心设置,而在某些情况下,它们可能设置在多个区域/数据中心。在每个区域/数据中心,将配置两个或多个路由器和消息处理器。
诊断
- 如果有多个区域/数据中心,请确定 API 请求失败并出现 502 Bad Gateway 错误的区域/数据中心。您可以通过以下方法找到此问题:用户发现 502 错误所在的区域,或检查属于不同区域的每个路由器
/opt/apigee/var/log/edge-router/nginx/
目录中的 NGINX 访问日志。 - 您会在 NGINX 错误日志 (
/opt/apigee/var/log/edge-router/nginx/ORG-Env.
) 中看到以下错误_error_log
2019/06/24 15:26:00 [error] 4796#4796: *56357443 no live upstreams while connecting to upstream, client: <Router_IP_address>, server: <HostAlias>, request: "PUT <BasePath> HTTP/1.1", upstream: "http://<ListOfMP-IP_R-MP-Port>/<BasePath>", host: "<HostAlias>"
场景 1:所有消息处理器均已关闭
- 检查特定区域/数据中心内的消息处理器是否已启动并正常运行。
- 如果所有消息处理器都已关闭,请重启它们。
分辨率
使用以下命令重启所有消息处理器:
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
场景 2:所有消息处理器都忙于处理正在进行的请求
如果路由器发现指定区域/数据中心内的所有消息处理器都不可用,则会出现此错误,因为它们都在忙于处理正在进行的请求。
- 检查特定区域/数据中心内的消息处理器是否已启动并正常运行。
- 如果所有消息处理器都已启动并处于活跃状态,请检查消息处理器是否 CPU 使用率过高,然后使用以下命令每 30 秒生成三次线程转储:
<JAVA_HOME>/bin/jstack -l <pid> > <filename>
- 如果消息处理器的内存用量较高,请使用以下命令生成堆转储:
sudo -u apigee
/bin/jmap -dump:live,format=b,file= - 使用以下命令重启消息处理器。系统应该会降低 CPU 和内存:
/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
- 监控 API 调用以确认问题是否仍然存在。
- 请联系 Apigee 支持团队并提供线程转储、堆转储和消息处理器日志 (
/opt/apigee/var/log/edge-message-processor/logs/system.log
),以帮助调查 CPU/内存用量较高的原因。
原因:路由器和 MP 之间的 SSL 配置不正确
诊断
- 查看 NGINX 访问日志 (
/opt/apigee/var/log/edge-router/nginx/ORG-Env.
)。您将看到如下所示的 502 响应:_access_log
2019-07-23T12:13:42+03:00 sc-10-254-226-23 10.X.X.X:53634 10.X.X.X:8998 0.000 - - 502 502 189 344 GET <path> curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 libidn/1.18 libssh2/1.4.2 <host alias> mp-10-254-226-23-23706-8552529-1 10.129.107.101 - - -1 - - dc-2 gateway-2 green - gateway-2 dc-2 op pilot http -
- 查看 NGINX 错误日志 (
/opt/apigee/var/log/edge-router/nginx/ORG-Env.
)。您会看到如下错误:_error_log
2019/07/30 17:02:24 [error] 7691#7691: *11753633 peer closed connection in SSL handshake while SSL handshaking to upstream, client: X.X.X.X, server: <HostAlias>, request: "GET /no-target HTTP/1.1", upstream: "https://X.X.X.X:8998/no-target", host: "<HostAlias>"
- 这表明路由器和消息处理器之间的 SSL 握手失败。
- 如果您仔细查看第 1 步和第 2 步的错误消息,则用于与消息处理器进行通信的端口编号是 8998,这是一个非安全端口,但协议是 SSL (https)。通常使用的安全端口为 8443。由于使用非安全端口进行安全通信,因此会导致 SSL 握手失败。
- 如果在路由器和消息处理器之间配置 SSL 时漏掉了任何步骤或设置的值不正确,通常就会发生这种情况。请参阅此处概述的步骤。
例如,如果
<ph type="x-smartling-placeholder">- </ph>
/opt/apigee/customer/application/message-processor.properties as shown below
中的端口 # 指定为 8998,而不是 8443conf/message-processor-communication.properties+local.http.port=8998
- 在执行 SSL 配置时,系统不会删除
/opt/nginx/conf.d/*
目录下的路由器配置文件,且该路由器尚未重启。在这种情况下,您会发现消息处理器的端口编号在配置文件中将保留为 8998。
分辨率
- 确保正确遵循在路由器和邮件处理器之间配置 TLS 中提供的所有步骤。
- 如果问题仍然存在,请参阅收集诊断信息。
原因:后端服务器出错
诊断
- 如果错误每次都会发生,您可以捕获失败请求的界面跟踪记录。选择失败的请求并浏览跟踪记录中的各个阶段。如果您发现后端服务器本身收到了“502 Bad Gateway”(502 错误网关),那么问题可能在于后端服务器可能发生了某种故障。
显示来自后端服务器的“502 Bad Gateway”的跟踪记录
- 如果问题是间歇性的,并且您无法捕获跟踪记录,请
<ph type="x-smartling-placeholder">- </ph>
- 如果您是公有云用户,则可以使用 API 监控并查看有关 502 错误的详细信息。
- 如果您发现错误代码为
messaging.adaptors.http.flow.ErrorResponseCode
且故障来源为target
,则错误是由后端服务器导致的。
- 如果您发现错误代码为
- 如果您是 Private Cloud 用户,则可以分析 NGINX 访问日志
/opt/apigee/var/log/edge-router/nginx/ORG-Env.
_access_log.
对于失败请求,您会看到如下条目:
2017-02-24T14:42:12+00:00 rt-01 192.8.155.2:18118 192.168.84.166:8998 10.225 - - 502 502 440 0 GET /adv-eadlg-test/documents?type=doctype HTTP/1.1 rt-02efawae234-1234 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36 myorg-dev.apigee.net rt-02efawae234-1234 6 - false target messaging.adaptors.http.flow.ErrorResponseCode null/null - /organizations/myorg/environments/dev/apiproxies/api123
- 如果您发现错误代码为
messaging.adaptors.http.flow.ErrorResponseCode
且故障来源为target
,则错误是由后端服务器导致的。
- 如果您发现错误代码为
- 如果您是公有云用户,则可以使用 API 监控并查看有关 502 错误的详细信息。
分辨率
- 与您的后端服务器团队合作,在后端解决此问题。
收集诊断信息
- NGINX 访问日志
(/opt/apigee/var/log/edge-router/nginx/ORG-Env.
)_access_log
和错误日志
(/opt/apigee/var/log/edge-router/nginx/ORG-Env.
)。_error_log - 消息处理器日志“
” (/opt/apigee/var/log/edge-message-processor/logs/system.log
)。