迁移到 fastify 后,ECS Fargate 健康检查失败

ECS Fargate health checks are failing after migrating to fastify

我有一个SSR服务器。它曾经在 ExpressJS 上 运行 。出于性能原因,我将其迁移到了 Fastify。现在,我的健康检查不断失败,因此我的容器停止了。

我的 CloudFormation 将健康检查定义为:

  HealthCheckPath:
    Type: String
    Default: /categories

它适用于 Express。当我用 curl -I 对 Express 服务器调用此路由时,它 returns:

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 开始,不再需要 head 处理程序,除非它们正在做一些不寻常的事情。现在,fastify 可以类似于 express 基于 GET 处理程序自行处理 HEAD。默认配置禁用此功能。

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

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

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