Flask 上传文件出现 Request Entity Too Large 报错,通常需要在 Flask 应用配置中设置 MAX_CONTENT_LENGTH,并在 Nginx 或 WSGI 服务器中同步调整请求体限制。适用场景为 Web 服务接收大文件上传,风险边界在于设置过大可能导致服务器内存溢出。
先说结论:解决 413 错误需要同时检查 Flask 应用层和反向代理层的配置限制,单一修改往往无效。
- 先确认:报错来源是 Nginx、Gunicorn 还是 Flask 应用本身
- 先处理:在 Flask 配置 MAX_CONTENT_LENGTH 并在 Nginx 配置 client_max_body_size
- 再验证:使用 curl 命令上传超出限制的文件测试是否拦截
命令速用版
以下是 Flask 应用和 Nginx 的核心配置片段,直接替换对应数值即可。
# Flask 应用配置 (单位:字节)
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
# Nginx 配置 (http 或 server 块)
client_max_body_size 16M;为什么会这样
Request Entity Too Large 是 HTTP 413 状态码,表示请求体超过服务器允许的最大大小。请求链路中任何一层(Nginx、WSGI 服务器、Flask 应用)设置了限制且未匹配,都会触发此报错。
默认情况下,Nginx 限制请求体为 1MB,Flask 默认不限制但受限于 WSGI 服务器缓冲区。如果只修改了 Flask 代码而 Nginx 仍保持默认,请求会在到达 Flask 之前被 Nginx 拦截。
分步处理
按照请求链路顺序,从外层代理到内层应用逐一放行。
步骤 1:修改 Flask 应用配置
在 Flask 初始化代码中设置最大内容长度,单位为字节。例如限制 16MB:
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024步骤 2:修改 Nginx 配置
编辑 Nginx 配置文件,在 http 或 server 块中添加 client_max_body_size。修改后需重载配置:
nginx -s reload步骤 3:检查 WSGI 服务器
如果使用 Gunicorn 或 uWSGI,检查是否有请求体限制参数。Gunicorn 默认通常无硬性限制,但需确保 timeout 设置足够长以防大文件上传超时。
怎么验证是否生效
使用 curl 命令构造不同大小的文件进行上传测试,观察 HTTP 状态码。
# 生成一个 10MB 测试文件
dd if=/dev/zero of=test10M.bin bs=1M count=10
# 上传测试 (假设接口为 /upload)
curl -X POST -F "file=@test10M.bin" http://your-domain/upload验证结果判断:如果返回 413,说明限制仍生效;如果返回 200 或业务逻辑定义的 success 状态,说明限制已放宽。
常见坑
- 单位混淆:Flask 配置 MAX_CONTENT_LENGTH 必须使用字节,Nginx 支持 K/M/G 后缀。
- 配置层级:Nginx 配置需放在 http 或 server 块内,放在 location 块可能不生效。
- 内存风险:调大限制会增加服务器内存占用,高并发场景需谨慎评估。
常见问题
413 错误是 Flask 抛出的吗?
不一定,Nginx 或 WSGI 服务器也会在请求到达 Flask 前抛出 413 错误。
Flask 默认有文件大小限制吗?
Flask 框架本身默认不限制大小,但受限于底层 WSGI 服务器和操作系统配置。
修改配置后需要重启服务吗?
Flask 代码修改需要重启应用进程,Nginx 配置修改需要执行 reload 命令。
参考来源
- Flask Official Documentation, Configuration Handling, https://flask.palletsprojects.com/
- Nginx Official Documentation, ngx_http_core_module, client_max_body_size, https://nginx.org/en/docs/