我在 Google App Engine 上看到了很多 502“Bad Gateway”错误。下面的图表很难看清(颜色非常相似,我不知道如何更改它们),但这是我过去 6 小时内的流量:
深粉色线表示 5xx 错误。它们于今天早上 9:30 左右开始,并于太平洋标准时间下午 12:30 左右平息。但在这 3 个小时里,nginx 一直返回502 Bad Gateway
。然后它就停止了。
在那段时间内,我对代码做出的唯一提交尝试改变这种行为的方法是将每个实例的内存从 0.5 增加到 1G,并增加某些 404 响应的缓存 TTL。我还添加了活性检查因此 nginx 会知道应用服务器何时宕机。
我检查了 nginx 的错误日志,发现有如下错误:
failed (111: Connection refused) while connecting to upstream
我检查了三遍,发现我的所有应用服务器都在端口 8080 上运行,所以我排除了这种可能。我想也许活动性检查有助于应用引擎知道何时重新启动需要重新启动的服务器,但我没有在应用服务器的标准输出日志中看到任何表明其中任何一个服务器有问题的信息。
这可能只是某种应用引擎错误吗?
编辑于太平洋标准时间晚上 9:17:下面是我过去 24 小时内 App Engine 流量的图片,应用程序的代码更改很少。我已突出显示 5xx 峰值,以便您可以更清楚地看到它们。
答案1
不幸的是,导致 502 错误激增的原因有很多,例如:
- 后端实例的响应时间超过了后端服务超时时间,这意味着应用程序过载或后端服务超时设置得太低。
- 前端无法与后端实例建立连接。
- 前端无法识别要连接的可行后端实例。(所有后端的健康检查均失败)
要获取更多信息,您需要查看 Stackdriver 日志解决云端控制台中的 502 错误。
下次出现峰值时,您可以检查 502 错误是否是由您的健康检查给出误报引起的。还有另一个ServerFault 帖子有相同问题的人可以为您提供更多信息。如果是这种情况,您可能需要考虑增加实例的磁盘空间。
为了避免进一步的峰值,我建议您在 app.yaml 文件中除了活性检查外还添加就绪性检查,以便您的实例在完全准备好接收流量之前不会获得任何流量。您可能已经看到了这一点,但是这是文档用于添加就绪检查
最后要检查的是,与所有流量相比,出现峰值的流量百分比是否在服务水平协议。