EC2 Ubuntu部署Flask深度学习API遇Nginx 504超时问题求助
嘿,这个问题我太熟悉了——长耗时的AI模型API很容易碰到这类超时问题,尤其是处理多任务的时候。咱们先从最直接的配置问题入手,一步步解决:
1. 修正Nginx站点配置的超时参数
你当前的站点配置里用了fastcgi_read_timeout,但你的API是通过uWSGI和Nginx通信的,这个参数对uWSGI完全无效!得换成uWSGI专属的超时设置,同时把超时时间拉到足够覆盖10个标签的预测时长(单个5分钟,10个就是50分钟左右,设置3600秒即1小时足够):
修改/etc/nginx/sites-enabled/default里的server块:
server { listen 80; server_name xxx; charset utf-8; client_max_body_size 75M; # 替换原有的fastcgi_read_timeout,添加uWSGI相关超时 uwsgi_read_timeout 3600; uwsgi_send_timeout 3600; uwsgi_connect_timeout 3600; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:8000; uwsgi_param UWSGI_CHDIR /home/ubuntu/xxxx/src; uwsgi_param UWSGI_SCRIPT app:app; } }
2. 检查并调整uWSGI的超时设置
光Nginx设置还不够,uWSGI本身有个harakiri(切腹)机制,会自动杀死运行时间过长的进程,这也会导致超时。你需要在uWSGI的配置文件(比如uwsgi.ini)里添加以下参数:
[uwsgi] # 保留你原有配置的前提下,新增这些超时设置 harakiri = 3600 # 允许进程最长运行3600秒 socket-timeout = 3600 # socket连接超时 http-timeout = 3600 # HTTP请求超时
如果是用命令行启动uWSGI,就加上对应的参数:
uwsgi --socket 127.0.0.1:8000 --chdir /home/ubuntu/xxxx/src --module app:app --harakiri 3600 --socket-timeout 3600 --http-timeout 3600
3. 排查AWS层面的超时限制
如果你用了AWS的弹性负载均衡(ELB/ALB),那负载均衡本身也有连接超时设置,默认可能只有60-120秒,这会导致ELB先断开连接,Nginx直接返回504。你需要登录AWS控制台,找到对应的负载均衡器,调整空闲超时时间到3600秒(ALB最大支持4000秒,完全足够)。
另外,确认EC2安全组的入站/出站规则没有限制长时间TCP连接,不过这个一般不会是问题,但也可以顺手检查一下。
4. 验证配置并测试
修改完所有配置后,重启Nginx和uWSGI生效:
sudo systemctl restart nginx sudo systemctl restart uwsgi # 换成你实际的uWSGI服务名
测试时可以给curl加上-v参数,查看详细的请求过程,同时可以查看Nginx的错误日志/var/log/nginx/error.log和uWSGI的日志,确认是否还有超时问题。如果还是报错,可以从日志里找具体的触发点,再针对性调整。
内容的提问来源于stack exchange,提问作者tktktk0711

