502 Bad Gateway

您正在查看 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 组件可能仅在一个区域/数据中心内设置,而在某些情况下,它们可能在多个区域/数据中心内设置。在每个区域/数据中心内,将配置两个或更多路由器和消息处理器。

诊断

  1. 确定 API 请求失败并显示 502 Bad Gateway 错误的区域/数据中心(如果存在多个区域/数据中心)。您可以通过以下方式找到此信息:确定用户观察到 502 错误的区域,或检查属于不同区域的每个路由器上 /opt/apigee/var/log/edge-router/nginx/ 目录中的 NGINX 访问日志。
  2. 您将在 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:所有消息处理器均已关闭

  1. 检查特定区域/数据中心内的消息处理器是否已启动并运行。
  2. 如果所有消息处理器均已关闭,请重启它们。

解决方案

使用以下命令重启所有消息处理器:

/opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart

情况 2:所有消息处理器均正忙于处理正在进行的请求

如果路由器发现给定区域/数据中心内的所有消息处理器均不可用,因为它们正忙于处理正在进行的请求,则会发生此错误。

  1. 检查特定区域/数据中心内的消息处理器是否已启动并运行。
  2. 如果所有消息处理器均已启动并处于活跃状态,请检查消息处理器是否遇到 CPU 使用率过高的情况,然后使用以下命令每 30 秒生成三个线程转储:
    <JAVA_HOME>/bin/jstack -l <pid> > <filename>
  3. 如果消息处理器遇到内存用量过高的情况,请使用以下命令生成堆转储:
    sudo -u apigee /bin/jmap -dump:live,format=b,file= 
  4. 使用以下命令重启消息处理器。它应会降低 CPU 和内存使用率:
    /opt/apigee/apigee-service/bin/apigee-service edge-message-processor restart
  5. 监控 API 调用,以确认问题是否仍然存在。
  6. 联系 Apigee 支持团队,并提供线程转储、堆转储和消息处理器日志 (/opt/apigee/var/log/edge-message-processor/logs/system.log),以帮助调查 CPU/内存使用率过高的原因。

原因:路由器和 MP 之间的 SSL 配置不正确

诊断

  1. 检查 NGINX 访问日志 (/opt/apigee/var/log/edge-router/nginx/ORG-Env._access_log)。您将看到 502 响应,如下所示:
        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	-
  2. 检查 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>"
  3. 这表示路由器和消息处理器之间的 SSL 握手失败。
  4. 如果您仔细查看第 1 步和第 2 步中的错误消息,会发现用于与消息处理器通信的端口号为 8998,这是一个不安全的端口,但协议为 SSL (https)。通常,使用的安全端口号为 8443。 由于不安全的端口用于安全通信,因此会导致 SSL 握手失败。
  5. 通常,如果您在路由器和消息处理器之间配置 SSL 时遗漏了任何步骤或设置了任何不正确的值,则可能会发生这种情况。 请参阅此处列出的步骤。
    例如,如果出现以下情况,则可能会发生此错误:
    1. 端口号在 /opt/apigee/customer/application/message-processor.properties as shown below
      中指定为 8998 而不是 8443
              conf/message-processor-communication.properties+local.http.port=8998
    2. 在执行 SSL 配置时,未删除 /opt/nginx/conf.d/* 目录下的路由器配置文件,并且未重启路由器。在这种情况下,您会注意到消息处理器的端口号在配置文件中仍为 8998。

解决方案

  1. 确保正确遵循在 路由器和消息处理器之间配置 TLS 中提供的所有步骤。
  2. 如果问题仍然存在,请前往收集诊断信息。

原因:后端服务器出错

诊断

  1. 如果每次都发生错误,您可以捕获失败请求的界面跟踪。选择失败的请求,然后在跟踪中浏览各个阶段。如果您注意到自己从后端服务器本身收到“502 Bad Gateway”,则问题可能是因为后端服务器上可能发生了某些故障。
    跟踪显示来自后端服务器的 502 Bad Gateway
  2. 如果问题是间歇性的,并且您无法捕获跟踪,
    1. 如果您是 Public Cloud 用户,则可以使用 API 监控 并查看有关 502 错误的详细信息。
      1. 如果您观察到故障代码为 messaging.adaptors.http.flow.ErrorResponseCode,并且故障来源为 target,则表示该错误是由后端服务器引起的。
    2. 如果您是 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
      1. 如果您观察到故障代码为 messaging.adaptors.http.flow.ErrorResponseCode,并且故障来源为 target,则表示该错误是由后端服务器引起的。

解决方案

  1. 与后端服务器团队合作,以修复后端中的此问题。

收集诊断信息

  1. NGINX 访问日志
    (/opt/apigee/var/log/edge-router/nginx/ORG-Env._access_log)
    和错误日志
    (/opt/apigee/var/log/edge-router/nginx/ORG-Env._error_log)。
  2. 消息处理器日志
    (/opt/apigee/var/log/edge-message-processor/logs/system.log)。