部署在AWS App Runner的Flask应用调用长耗时API返回502错误
解决AWS App Runner上Flask+Gunicorn长耗时API返回502 Bad Gateway的问题
问题背景
Flask应用基于Gunicorn部署在AWS App Runner上,原本运行稳定。新增一个需调用多个端点、响应耗时2-3分钟的API后,本地测试正常,但部署到App Runner后每次调用该API都会返回502 Bad Gateway。应用日志无报错信息,其余所有端点均可正常工作。
现有配置文件
Dockerfile
FROM python:3.11 ENV VIRTUAL_ENV=/opt/venv RUN python3 -m venv $VIRTUAL_ENV ENV PATH="$VIRTUAL_ENV/bin:$PATH" RUN pip cache purge RUN pip install --upgrade pip # Install dependencies: COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # Run the application: COPY . . CMD ["gunicorn", "--config", "gunicorn_config.py", "app:app"]
Gunicorn_config.py
import os workers = int(os.environ.get('GUNICORN_PROCESSES', '2')) threads = int(os.environ.get('GUNICORN_THREADS', '4')) bind = os.environ.get('GUNICORN_BIND', '0.0.0.0:8080') #timeout = int(os.environ.get('GUNICORN_TIMEOUT', '600')) forwarded_allow_ips = '*' secure_scheme_headers = { 'X-Forwarded-Proto': 'https' }
问题原因
502 Bad Gateway的核心原因是超时不匹配:
- Gunicorn配置中
timeout被注释,使用默认值(30秒),远短于API的2-3分钟响应时间,会导致Gunicorn提前终止请求。 - AWS App Runner默认请求超时为60秒,即使Gunicorn不主动终止,App Runner的负载均衡层也会因等待过久返回502。
- 本地测试通常使用Flask开发服务器,无严格超时限制,因此能正常运行。
解决方案
1. 调整Gunicorn超时设置
取消gunicorn_config.py中timeout行的注释,设置足够长的超时时间(建议比API最长耗时多1-2分钟,比如300秒=5分钟):
timeout = int(os.environ.get('GUNICORN_TIMEOUT', '300'))
确保Gunicorn不会提前终止长耗时请求。
2. 修改AWS App Runner请求超时配置
登录AWS控制台,进入目标App Runner服务:
- 切换至配置标签页,找到运行时配置模块
- 点击编辑,找到请求超时选项
- 将超时时间设置为大于3分钟的值(如300秒),保存更改
让App Runner的负载均衡层能等待足够长的时间获取后端响应。
3. 验证修复
重新部署应用到App Runner,测试长耗时API,确认502问题解决。若仍有异常,检查是否存在Flask扩展等中间件的额外超时限制,或查看App Runner访问日志进一步排查。
内容的提问来源于stack exchange,提问作者andoni90
相关产品推荐
相关产品推荐

