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

从EC2调用Windows服务器外部API时遭遇504网关超时求助

解决Flask调用慢API导致的504 Gateway Timeout问题

针对你遇到的Flask调用外部慢API返回504超时的问题,结合你已经配置Nginx超时但无效的情况,按以下步骤排查和解决:

1. 检查WSGI服务器的超时配置

Flask通常搭配Gunicorn、uWSGI这类WSGI服务器运行,这些服务器自身的超时限制会优先于Nginx配置生效:

  • 如果用Gunicorn,启动时添加--timeout 600参数(设置为10分钟,覆盖默认的30秒)
  • 如果用uWSGI,在配置文件中添加harakiri = 600(请求超时时间,单位秒)

2. 验证Nginx配置的正确性

确保你的Nginx配置已经正确生效:

  • 检查配置是否写在对应请求的server块中,而非全局配置
  • 执行nginx -t验证配置语法无错误
  • 执行nginx -s reload重启Nginx使配置生效
  • 可额外添加proxy_buffering off;,避免Nginx因缓冲等待响应超时

3. 确认外部API的IIS超时设置

部署在IIS上的外部API自身也可能有超时限制:

  • 打开IIS管理器,找到对应站点,进入高级设置,修改连接超时为大于120秒(2分钟)
  • 如果是ASP.NET应用,修改web.config中的executionTimeout:
    <httpRuntime executionTimeout="600" /> <!-- 单位秒,设置为10分钟 -->
    

4. 修正Flask中requests的超时参数

注意requests.post的timeout参数单位是秒,你代码中的600000等于1000分钟,虽数值足够,但建议明确设置为元组避免歧义;同时修正路径中的重复斜杠:

@app.route('/api/callapi_abcd/', methods=['GET','POST'])
def callapi_abcd():
    url = 'https://externalapi.com/api/callexternalAPI/'
    # 设置连接超时10秒,读取超时600秒
    response = requests.post(url, json=post_data, timeout=(10, 600), stream=True)
    # 后续处理逻辑

5. 排查网络层超时

  • 检查EC2安全组是否允许出站访问外部API的HTTPS端口(443)
  • 检查Windows服务器的防火墙是否允许EC2的IP访问目标API端口
  • 在EC2上用curl命令直接调用外部API,测试是否能正常获取响应,排除网络层面问题

6. 异步处理(彻底解决长连接超时问题)

如果外部API响应确实需要1-2分钟,最稳妥的方式是改成异步任务:

  • 用Celery搭配Redis/RabbitMQ做任务队列,Flask收到请求后,将调用外部API的任务放入队列,立即返回一个任务ID给前端
  • 前端通过轮询或WebSocket查询任务状态,待任务完成后获取结果
  • 这种方式避免了长连接占用资源,也彻底解决了各类超时问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 15:47:11