Nginx设置请求大小限制,控制上传文件大小
当网站上传大文件时出现 413 Request Entity Too Large,多数情况是 Nginx 的请求体大小限制在起作用。
Nginx 通过 client_max_body_size 指令控制单个请求允许的最大体积,默认值通常为 1MB,超过限制就会直接拒绝。
本文按零基础可照做的顺序,讲清配置位置、修改命令、重载方式和验证结果,帮你彻底解决上传大小限制问题。
先确认是不是 Nginx 在拦截
浏览器按 F12 打开开发者工具,切换到 Network 面板,再次上传文件。
如果看到状态码 413,基本可以确定是 Nginx 限制。
也可以查看 Nginx 错误日志确认:
tail -f /var/log/nginx/error.log
日志中出现 client intended to send too large body 字样,就是本文要处理的问题。
另外要区分:如果后端是 PHP,还需要同步调整 php.ini 中的 upload_max_filesize 和 post_max_size,否则 Nginx 放行后仍会被 PHP 拦截。
修改 client_max_body_size 的两种位置
client_max_body_size 可以放在 http、server 或 location 块中,作用范围依次缩小。
建议优先在站点对应的 server 块中设置,避免影响其他站点。
方式一:修改站点配置文件
宝塔面板用户可在“网站”列表点击对应站点,进入“配置文件”直接编辑。
命令行用户按发行版路径操作:
# 宝塔面板路径
/www/server/panel/vhost/nginx/你的域名.conf
# 常见编译安装路径
/usr/local/nginx/conf/nginx.conf
# apt 安装路径
/etc/nginx/sites-available/default
在 server { } 内部加入一行,例如允许 50MB:
server {
listen 80;
server_name example.com;
client_max_body_size 50m;
# 其余配置保持不变
}
单位支持 k、m、g,不区分大小写,写 50m 比写 52428800 更直观。
方式二:在 location 中单独放宽
只想让某个上传接口放宽限制时,可以写在 location 块内:
location /upload/ {
client_max_body_size 200m;
proxy_pass http://127.0.0.1:8080;
}
这种方式粒度更细,适合上传接口与普通页面共用同一域名的场景。
重载配置并验证是否生效
修改完成后先检查语法,再重载,不要直接重启,避免中断现有连接:
nginx -t
nginx -s reload
宝塔面板可直接点击“重载配置”按钮。
验证方法有两种:
- 用
curl模拟上传一个超过原限制的文件,观察返回码是否不再是 413。 - 直接在业务页面上传一个略小于新限制的文件,确认成功。
如果仍然报 413,检查是否存在多层 Nginx 或前置代理。
例如 CDN、负载均衡、Docker 中的 Nginx 容器,每一层都可能独立限制请求体大小,需要逐层确认。
容易踩坑的几个细节
改错文件:服务器上可能存在多个 Nginx 配置文件,用 nginx -T 可以打印最终生效的完整配置,搜索 client_max_body_size 确认实际值。
忘记后端限制:Nginx 放行后,PHP 的 upload_max_filesize、post_max_size,Java 的 spring.servlet.multipart.max-file-size,Node 的 body 解析限制都需要同步调整。
任何一环没放开,上传依然失败。
限制设得过大:把 client_max_body_size 设为 0 表示不限制,但这会让服务器暴露在超大请求体攻击风险下。
建议按业务真实需求设置,例如 50m 或 100m,而不是直接关闭限制。
重载未生效:确认执行 nginx -s reload 的用户有权限,且没有报错。
可以用 ps aux | grep nginx 查看 master 进程是否接收了信号。
常见疑问
413 和 502 有什么区别? 413 是请求体超过 Nginx 限制被拒绝,502 通常是后端服务不可用或超时,两者排查方向不同。
修改后需要重启服务器吗? 不需要。nginx -s reload 是平滑重载,不会断开现有连接。
为什么设置了 50m 还是传不上去? 优先检查后端语言的上传限制和前置代理层,Nginx 只是其中一环。
控制上传文件大小的核心就是 client_max_body_size,改对位置、同步后端、逐层排查,413 报错基本都能解决。
建议改完后用实际文件测试一次,确认最终效果符合预期。