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

NodeJS中Axios调用AWS Flask服务超时设置失效问题排查

问题分析与解决方案

问题描述

NodeJS服务通过axios向AWS上的Flask服务发送POST请求,Flask服务因处理机器学习任务需30分钟才能响应。已在axios中设置timeout: 1800000(30分钟),但仍收到502代理错误,错误提示代理服务器从上游服务器读取数据失败。

核心原因

axios的客户端超时设置仅控制本地等待响应的时间,但网络中间的代理/负载均衡、后端服务本身的超时设置会先截断连接,导致502错误:

  1. AWS弹性负载均衡(ELB)默认空闲超时为60秒,远短于30分钟,会提前断开连接
  2. Flask后端的WSGI服务器(如Gunicorn)默认超时较短,会终止长时间运行的请求
  3. NodeJS服务或AWS内部的其他代理服务器存在超时限制

解决步骤

1. 调整AWS ELB超时设置

如果Flask服务部署在ELB之后,需将ELB的空闲超时改为30分钟:

  • 登录AWS控制台,进入负载均衡器管理页面
  • 找到目标ELB,进入「属性」标签
  • 修改「空闲超时」为1800秒(30分钟)并保存

2. 配置Flask后端的超时

若使用Gunicorn作为WSGI服务器

启动Gunicorn时添加超时参数:

gunicorn --timeout 1800 app:app

该参数确保worker进程不会因任务运行超过30分钟被强制终止。

若使用Werkzeug开发服务器(仅用于测试)

在启动代码中设置超时:

from flask import Flask
app = Flask(__name__)

if __name__ == '__main__':
    app.run(timeout=1800)

注意:Werkzeug不适合生产环境,生产建议用Gunicorn/uWSGI。

3. 检查并调整代理服务器超时

如果NodeJS服务通过代理访问AWS,需修改代理的读取超时:

  • 比如Nginx代理,在配置中添加:
location /aws {
    proxy_pass http://your-aws-ip;
    proxy_read_timeout 1800s; # 设置为30分钟
}

4. 优化axios配置

确保axios配置中没有代理干扰,可明确关闭代理(若不需要):

const awsResponse = await axios.post(`${process.env.AWS_PUBLIC_IP}/aws`, data, {
    timeout: 1800000, // 30分钟
    proxy: false // 禁用本地代理,避免截断连接
});

长任务最佳实践

对于30分钟级别的长任务,不建议用同步POST请求等待响应,推荐异步模式:

  • NodeJS发送请求后,Flask立即返回一个唯一的task_id
  • Flask后台异步处理任务,完成后将结果存入数据库/缓存
  • NodeJS通过task_id定期轮询结果,或由Flask通过Webhook主动通知结果

内容的提问来源于stack exchange,提问作者Pranav K M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 17:15:55