首页 > 解决方案 > 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处理。默认配置禁用此功能。HEADGET

标签: node.jsamazon-web-servicesaws-fargatefastifyhealth-check

解决方案


由于 Fargate 在容器内运行代码,为了让 Fastify 工作,我们必须显式地传递 bind any。变成:

const address = await server.listen(PORT, '0.0.0.0');

这在容器内以及本地工作。


推荐阅读