部署在EC2+ELB的FastAPI应用突发502 Bad Gateway错误求助
问题描述
我有一个FastAPI应用部署在AWS EC2实例上,通过ELB实现SSL安全访问,应用使用docker-compose.yml运行,配置如下:
version: '3.8' services: fastapi: build: . ports: - 8000:8000 command: uvicorn app.main:app --host 0.0.0.0 --reload volumes: - .:/kwept environment: - CELERY_BROKER_URL=redis://redis:6379/0 - CELERY_RESULT_BACKEND=redis://redis:6379/0 depends_on: - redis worker: build: . command: celery worker --app=app.celery_worker.celery --loglevel=info --logfile=app/logs/celery.log volumes: - .:/kwept environment: - CELERY_BROKER_URL=redis://redis:6379/0 - CELERY_RESULT_BACKEND=redis://redis:6379/0 depends_on: - fastapi - redis redis: image: redis:6-alpine command: redis-server --appendonly yes volumes: - redis_data:/data volumes: redis_data:
截至周五晚,ELB端点运行完全正常,但今早突然出现502 Bad Gateway错误,我未修改任何代码或AWS配置。
相关配置信息
- ELB监听器设置:

- 关联EC2实例的目标组:

- 健康检查:使用默认设置,未配置自定义规则

本地排查结果
- 登录EC2实例查看FastAPI应用的Docker容器日志,显示应用启动正常:

- 执行
netstat -ntlp命令输出:
ELB日志片段
http 2022-07-21T06:47:12.458060Z app/dianee-tools-elb/de7eb044e99165db 162.142.125.221:44698 172.31.31.173:443 -1 -1 -1 502 - 41 277 "GET http://18.197.14.70:80/ HTTP/1.1" "-" - - arn:aws:elasticloadbalancing:eu-central-1:xxxxxxxxxx:targetgroup/dianee-tools/da8a30452001c361 "Root=1-62d8f670-711975100c6d9d4038d73544" "-" "-" 0 2022-07-21T06:47:12.457000Z "forward" "-" "-" "172.31.31.173:443" "-" "-" "-" http 2022-07-21T06:47:12.655734Z app/dianee-tools-elb/de7eb044e99165db 162.142.125.221:43836 172.31.31.173:443 -1 -1 -1 502 - 158 277 "GET http://18.197.14.70:80/ HTTP/1.1" "Mozilla/5.0 (compatible; CensysInspect/1.1; +https://about.censys.io/)" - - arn:aws:elasticloadbalancing:eu-central-1:xxxxxxxxxx:targetgroup/dianee-tools/da8a30452001c361 "Root=1-62d8f670-5ceb74c8530832f859038ef6" "-" "-" 0 2022-07-21T06:47:12.654000Z "forward" "-" "-" "172.31.31.173:443" "-" "-" "-" http 2022-07-21T06:47:12.949509Z app/dianee-tools-elb/de7eb044e99165db 162.142.125.221:48556 - -1 -1 -1 400 - 0 272 "- http://dianee-tools-elb-yyyyyy.eu-central-1.elb.amazonaws.com:80- -" "-" - - - "-" "-" "-" - 2022-07-21T06:47:12.852000Z "-" "-" "-" "-" "-" "-" "-"
排查方案与原因分析
核心问题定位
从现有信息来看,502错误的直接原因是ELB与后端服务的端口不匹配,导致请求转发失败:
1. 目标组端口与后端服务端口不一致
你的FastAPI容器通过docker-compose映射的是8000端口,但目标组配置的转发端口是443,ELB试图将请求转发到EC2的443端口,而该端口没有对应的服务监听(从netstat输出可确认,只有8000端口被docker-proxy占用),直接导致转发失败触发502。
2. 健康检查失败导致实例被标记为不健康
目标组默认健康检查针对443端口,由于该端口无服务响应,健康检查持续失败,EC2实例被目标组标记为不健康,ELB停止向其转发请求,进一步加剧502错误的出现。
修复步骤
- 修改目标组配置:将目标组的转发端口、健康检查端口全部改为8000,健康检查路径可设置为FastAPI的默认路径
/或/docs(确保返回200状态码)。 - 验证健康状态:修改配置后等待3-5分钟,查看目标组中EC2实例的健康状态是否变为正常。
- 测试访问:健康状态正常后,重新访问ELB端点,确认502错误是否消除。
- 生产环境优化建议:
- 移除FastAPI启动命令中的
--reload参数,改用生产级启动方式:uvicorn app.main:app --host 0.0.0.0 --port 8000。 - 在FastAPI中添加专门的健康检查接口,例如:
并将目标组健康检查路径改为from fastapi import FastAPI app = FastAPI() @app.get("/health") async def health_check(): return {"status": "ok"}/health,提升检查准确性。
- 移除FastAPI启动命令中的
内容的提问来源于stack exchange,提问作者some_programmer
相关产品推荐
相关产品推荐

