您正在查看 Apigee Edge 文档。
转到
Apigee X 文档。 info
问题
客户端应用获取 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 Public Cloud 和 Private Cloud 用户 |
原因:池中没有可用的 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 时遗漏了任何步骤或设置了任何不正确的值,则可能会发生这种情况。 请参阅此处列出的步骤。
例如,如果出现以下情况,则可能会发生此错误:
- 端口号在
/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 Bad Gateway
- 如果问题是间歇性的,并且您无法捕获跟踪,
- 如果您是 Public Cloud 用户,则可以使用 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,则表示该错误是由后端服务器引起的。
- 如果您观察到故障代码为
- 如果您是 Public Cloud 用户,则可以使用 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)。