502 Bad Gateway

您正在查看的是 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 配置不正确 如果 Edge 路由器的信任库中缺少客户端 CA 签名的根证书,则会出现此错误。 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 Access 日志。
  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 Access 日志 (/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. 系统不会删除 /opt/nginx/conf.d/* 目录下的路由器配置文件,并且在执行 SSL 配置时没有重新启动路由器。在这种情况下,您会发现消息处理器的端口编号在配置文件中仍为 8998。

分辨率

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

原因:后端服务器出错

诊断

  1. 如果错误每次都发生,您可以捕获失败请求的界面跟踪记录。选择一个失败的请求,并浏览跟踪记录中的各个阶段。如果您发现后端服务器本身收到了“502 Bad Gateway”错误消息,那么问题可能在于后端服务器上出现了某种故障。
    显示来自后端服务器的 502 Bad Gateway 的跟踪记录
  2. 如果问题是间歇性的,因此您无法捕获跟踪记录,
    1. 如果您是公有云用户,则可以使用 API Monitoring 并查看有关 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)。