Amazon EC2实例部署FastAPI+Uvicorn时出现Receive buffer too long错误及无效HTTP请求问题求助
解决FastAPI部署到EC2后出现的h11 RemoteProtocolError: Receive buffer too long问题
我之前踩过这个坑,这个错误本质是请求的数据大小超出了h11库默认的接收缓冲区限制,尤其是你这种前后端跨端口部署的场景,很容易因为大payload或者请求头触发这个问题。下面是几个亲测有效的解决方向:
1. 调整Uvicorn的请求大小限制
Uvicorn默认的请求大小上限比较保守,我们可以直接在启动时增大这个限制:
- 如果是用命令行启动FastAPI:
uvicorn main:app --host 0.0.0.0 --port 7879 --max-request-size 100MB
- 如果是用代码内嵌启动:
import uvicorn from fastapi import FastAPI app = FastAPI() # 你的业务路由代码... if __name__ == "__main__": uvicorn.run( app, host="0.0.0.0", port=7879, max_request_size=100 * 1024 * 1024 # 这里设置为100MB,可根据实际需求调整 )
2. 排查前端请求的内容
先确认是不是前端发送了超大的请求数据:
- 打开浏览器开发者工具,查看Network面板里的请求,检查Request Payload或者Request Headers的大小,比如有没有携带超大的文件、表单数据,或者Cookie里存了过多内容
- 先用
curl发送一个简单的小请求测试API是否正常,比如:
curl http://<你的EC2公网IP>:7879/你的测试路由
如果小请求正常,大请求报错,那基本可以确定是数据大小的问题,针对性优化前端请求(比如压缩数据、分块上传)或者继续调大后端的缓冲区限制。
3. 更新依赖库版本
旧版本的h11或者Uvicorn可能存在缓冲区处理的bug,直接升级到最新版本试试:
pip install --upgrade uvicorn h11
4. 检查EC2的网络配置(可选)
虽然这个概率不高,但可以排查下EC2实例的MTU(最大传输单元)设置,默认应该是1500,如果被修改过小可能会导致数据包拆分异常:
- 执行
ip addr查看网络接口的MTU值 - 如果不是1500,用命令改回:
sudo ip link set dev eth0 mtu 1500
(注意替换eth0为你的实际网卡名称)
内容的提问来源于stack exchange,提问作者VishalNadig
相关产品推荐
相关产品推荐

