node.js - ECS Fargate 健康检查在迁移到 fastify 后失败
问题描述
我有一个 SSR 服务器。它曾经在 ExpressJS 上运行。出于性能原因,我将其迁移到 Fastify。现在,我的健康检查一直失败,因此我的容器被停止了。
My CloudFormation 将运行状况检查定义为:
HealthCheckPath:
Type: String
Default: /categories
它适用于 Express。curl -I
当我使用Express 服务器调用此路由时,它返回:
HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 24289
ETag: W/"5ee1-y9SVwHfGNt2RUjXNZfi32jVx0EA"
Vary: Accept-Encoding
Date: Tue, 31 Aug 2021 16:05:46 GMT
Connection: keep-alive
我试图直接在 fastify 上做同样的事情。健康检查首先会失败,因为我只处理GET
,而我的服务器会HEAD
从探测中接收。
因此,我将处理程序加倍,所以现在我的代码具有:
server.get('/*', fp(loader));
server.head('/*', fp(loader));
第一行句柄GET
和第二个条目被调用HEAD
。它在本地解决了这个问题。当我这样做时$ curl -I http://localhost:3000/categories
,它会打印:
HTTP/1.1 200 OK
content-type: text/html
vary: accept-encoding
content-length: 24289
Date: Tue, 31 Aug 2021 15:32:51 GMT
Connection: keep-alive
似乎工作正常。但是,当我将我的东西部署到 Fargate 集群时,由于运行状况检查失败,部署失败。
service storefront-staging (port 3000) is unhealthy in target-group storefront-stagingTargetGroup due to (reason Health checks failed).
日志将请求路由到“健康”容器。检查失败的容器仅记录启动和停止操作。看不到任何请求被路由到他们,包括健康检查。我不明白有什么问题。请指教。
从fastify
版本 3.10.x 开始,不需要头部处理程序,除非它们正在做一些不寻常的事情。现在,fastify
可以,类似于基于处理程序的自身express
处理。默认配置禁用此功能。HEAD
GET
解决方案
由于 Fargate 在容器内运行代码,为了让 Fastify 工作,我们必须显式地传递 bind any。变成:
const address = await server.listen(PORT, '0.0.0.0');
这在容器内以及本地工作。
推荐阅读
- python-3.x - 文本文件数据转换为自然语言处理的数据集
- html - 边界元法。元素可以包含块吗?
- html - 剩余空间内容独立滚动
- laravel - 在同一视图中从循环解析数据到模态总是得到最后一个数据
- css - Vue.js - 导入的 CSS 中的图像不显示
- powershell - 带数字的卷曲命令 [PowerShell]
- spring - 在 Oracle DB 上写入时,处理 Spring 批处理写入器失败的空闲方式是什么?
- php - html标签中新行的正则表达式
- javascript - 未捕获的类型错误:$jq.sessionTimeoutTwo 不是函数
- python - 来自 excel 的嵌套字典组