amazon-web-services - 在运行 express / nginx 的 ECS 服务之前,AWS ALB 出现间歇性 502 网关错误
问题描述
背景:
我们正在运行一个通过 nginx 提供服务的单页应用程序,其中 node js (v12.10) 后端运行 express。它通过 ECS 作为容器运行,目前我们正在运行三个 t3a 介质作为我们的容器实例,其中每个运行 6 个副本的 api 和 Web 服务。我们使用 ALB 来处理我们的负载平衡/请求路由。我们在 3 个 AZ 上运行三个子网,负载均衡器与所有三个相关联,并且实例也分布在 3 个 AZ 上。
问题:
我们正试图找出一些间歇性 502 错误的根本原因,这些错误同时出现在前端和后端。我已经下载了 ALB 访问日志,所有这些请求的有趣之处在于它们都显示以下内容。- request_processing_time:0.000 - target_processing_time:0.000(有时这将是 0.001 或最多 0.004) - response_processing_time:-1
在出现这些错误时,我可以看到有可用的健康目标。
现在我知道有些人在服务器端比 ALB 端更短的 keepAlive 时间遇到了这样的问题,因此连接被强制关闭,然后 ALB 尝试重用(这符合故障排除指南在 AWS 上)。然而,当查看我们后端的 keepAlive 时间时,它们设置为比我们当前的 ALB 高一倍。此外,请求本身可以通过 chrome 开发工具重放并且它们成功(我不确定这是否是检查格式错误请求的有效方法,这似乎是合理的)。
我对这个领域非常陌生,如果有人对在哪里寻找或运行什么样的测试有一些建议,这可能有助于我查明这个问题,我将不胜感激。我在某些端点上运行了一些负载测试并复制了 502 错误,但是重负载下的错误与我在日志中看到的间歇性错误不同,因为 target_processing_time 非常高,所以在我看来,这完全是另一个问题。在这个阶段,我想了解显示 target_processing_time 基本上为零的错误。
解决方案
一年多前,我写了一篇关于这个的博客文章,可能值得一看(由于 NodeJS 8+ 中的行为变化):
https://adamcrowder.net/posts/node-express-api-and-aws-alb-502/
TL;DR 是您需要将 nodejs http.Server keepAliveTimeout
(以毫秒为单位)设置为高于负载均衡器的空闲超时(以秒为单位)。
另请注意,还有一个叫做 http-keepalive 的东西,它设置了一个 http 标头,它与这个问题完全没有关系。确保您设置正确。
另请注意,nodejs 中当前存在回归,其中设置keepAliveTimeout
可能无法正常工作。此处正在跟踪该错误:https ://github.com/nodejs/node/issues/27363 ,如果您仍然遇到此问题(您可能还需要设置headersTimeout
),则值得查看。
推荐阅读
- docker - 使用 go-sqlite3 CGO 启用包的 docker 构建速度非常慢
- python - python线程没有启动/超慢
- sql - 参加最后 3 小时并按 5 分钟分组
- java - MongoDb - 不在适当的位置添加数组对象,而是将其添加到根目录
- sas - 用另一个数据集突出显示相应的行号
- azure - Azure 索引错误:找到没有类型名称的资源,但未指定预期类型。这是什么意思?
- bash - 替换找到的第一个文件中的字符串
- javascript - 如何将 json 映射转换为数组?角
- django - Django:使用嵌套模型从许多关系查询中进行复杂排序和过滤
- javascript - 致命错误:CALL_AND_RETRY_LAST 分配失败 - JavaScript 堆内存不足 - Excel4node