502 Bad Gateway

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

诊断

  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 时漏掉了任何步骤或设置的值不正确,通常就会发生这种情况。请参阅此处概述的步骤。
    例如,如果
    <ph type="x-smartling-placeholder">
      </ph>
    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 错误网关),那么问题可能在于后端服务器可能发生了某种故障。
    显示来自后端服务器的“502 Bad Gateway”的跟踪记录
  2. 如果问题是间歇性的,并且您无法捕获跟踪记录,请
    <ph type="x-smartling-placeholder">
      </ph>
    1. 如果您是公有云用户,则可以使用 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)。