You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署在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监听器设置:
    ELB监听器设置
  • 关联EC2实例的目标组:
    目标组设置
  • 健康检查:使用默认设置,未配置自定义规则
    默认健康检查

本地排查结果

  1. 登录EC2实例查看FastAPI应用的Docker容器日志,显示应用启动正常:
    容器日志
  2. 执行netstat -ntlp命令输出:
    netstat输出

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错误的出现。

修复步骤

  1. 修改目标组配置:将目标组的转发端口、健康检查端口全部改为8000,健康检查路径可设置为FastAPI的默认路径/或/docs(确保返回200状态码)。
  2. 验证健康状态:修改配置后等待3-5分钟,查看目标组中EC2实例的健康状态是否变为正常。
  3. 测试访问:健康状态正常后,重新访问ELB端点,确认502错误是否消除。
  4. 生产环境优化建议:
    • 移除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,提升检查准确性。

内容的提问来源于stack exchange,提问作者some_programmer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 01:39:32