首次部署NestJS到AWS AppRunner遇TCP健康检查失败求助
NestJS部署AWS AppRunner健康检查失败排查方案
首次将NestJS应用部署到AWS AppRunner时,TCP/HTTP健康检查均失败,但本地运行容器完全正常?试试从以下几个方向排查:
1. 确认AppRunner端口配置无错误
- 检查AppRunner服务的端口映射,容器端口和访问端口必须均设置为
3003,避免端口填写错误 - 优先选择HTTP健康检查(NestJS本质是HTTP服务),TCP检查仅验证端口是否开放,无法确认服务是否真正就绪
2. 配置有效的HTTP健康检查端点
NestJS默认根路径/不一定返回200状态码(除非你自定义了接口),会导致AppRunner的HTTP健康检查失败。直接在main.ts中添加一个简单的健康检查接口:
async function bootstrap() { console.log('Starting server on port 3003'); const app = await NestFactory.create(AppModule); // 添加健康检查接口 app.getHttpAdapter().get('/health', (req, res) => { res.status(200).send('OK'); }); await app.listen(3003, '0.0.0.0'); } bootstrap();
之后在AppRunner健康检查配置中,将路径改为/health,同时调整检查参数:超时设置为10秒,间隔5秒,重试5次——默认超时时间可能过短,服务尚未启动完成就开始检查。
3. 通过AppRunner应用日志排查启动问题
进入AppRunner控制台查看应用日志,重点确认:
- 是否执行了
node dist/main命令,构建产物路径是否正确 - 有没有依赖缺失、模块加载失败等报错信息
- 是否输出了
Starting server on port 3003,确认服务确实启动成功
4. 验证容器内部端口监听状态
将ECR中的镜像拉取到本地运行,然后进入容器执行以下命令:
docker exec -it <容器ID> netstat -tulpn
确认node进程是否在监听0.0.0.0:3003(避免仅监听localhost导致外部无法访问)
5. 优化Docker构建流程(解决启动慢导致的超时)
如果是服务启动过慢引发健康检查超时,可使用多阶段构建缩小镜像体积,减少启动时间:
# 构建阶段:生成编译后的代码 FROM node:20 AS builder WORKDIR /usr/src/app COPY package*.json ./ RUN npm ci # 用ci安装依赖更稳定 COPY . . RUN npm run build # 运行阶段:仅保留运行所需文件 FROM node:20-slim WORKDIR /usr/src/app COPY --from=builder /usr/src/app/dist ./dist COPY --from=builder /usr/src/app/package*.json ./ RUN npm ci --only=production # 仅安装生产依赖 EXPOSE 3003 CMD ["node", "dist/main"]
内容的提问来源于stack exchange,提问作者Toni K.
相关产品推荐
相关产品推荐

