如何修改 nginx.conf 提高文件上传大小限制?
修改 client_max_body_size(如 100m)即可提高上传上限,可放 http/server/location 层;改完 nginx -t + reload;PHP 等应用层限制要同步调大。本文给出完整步骤与配套参数。
核心改动:在 nginx.conf 里设置 client_max_body_size 100m;(默认 1m,即 1 MiB)。放在 http 块全局生效、server 块按站点生效、location 块按路径生效;改完 nginx -t 校验并 reload。若应用是 PHP/Java 等,它们自身的上传限制也要同步放宽。
操作步骤
1. 定位主配置文件
nginx -t # 输出会显示配置文件路径
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
2. 编辑并添加指令
http {
client_max_body_size 100m; # 请求体总上限 100 MiB,含 multipart 开销
# 此处保留现有 server 等配置
}
或只针对上传路径:
location /upload {
client_max_body_size 500m;
proxy_pass http://127.0.0.1:8080; # 替换为实际上传处理服务
}
3. 校验并生效
sudo nginx -t && sudo systemctl reload nginx
配套要调的地方
大文件上传需核查超时(体积大了传输慢,别体积过了时间关不过):
client_body_timeout 120s;
proxy_read_timeout 120s; # 反代场景
fastcgi_read_timeout 120s; # PHP-FPM 场景
这些 read/body timeout 主要限制连续读操作之间的空闲时间,不是同一个端到端总时长。
应用层限制:
- PHP:
upload_max_filesize、post_max_size(post_max_size 需容纳全部请求体,upload_max_filesize 是单文件限制,按业务协调而非一律 ≥ Nginx) - Node/Express:express.json 的 limit 只约束 JSON;multipart 文件应在 multer/busboy 等上传解析器配置限制
- Spring:
spring.servlet.multipart.max-file-size
前置链路:CDN/云 LB(Cloudflare 免费版 100MB)也有自己的上限。
验证
curl -F "file=@bigfile.zip" http://your-site/upload
# 检查成功状态及应用实际保存的文件字节数/校验和,非413不等于成功
用接近上限和超过上限的文件各测试一次,并核对 Nginx 与应用日志,确认 413 来自哪一层。日志已送入观测云时,可按 Pipeline 快速开始验证状态码和路径字段,再按上传接口比较调整前后的失败请求;同时检查是否新增超时。
常见问题(FAQ)
Q:设多大合适?
A:按业务真实需求定,宁小勿大;纯附件上传场景 50-100m 常见。设 0 为不限制,公网不建议。
Q:改了还是 413?
A:检查是否有多层配置覆盖(location 里的旧值)、是否 reload、是否前面还有 CDN/网关限制,见本系列《client_max_body_size 不生效》篇。
Q:超大文件(GB 级)怎么办?
A:别硬扛单请求——分片上传或对象存储预签名直传。