必须在location块中显式配置client_max_body_size,因其优先级高于server和http块;还需同步调大client_body_buffer_size、确保client_body_temp_path权限正确、延长proxy_read_timeout等超时参数,并校准后端限制与请求头缓冲,否则仍会因缓冲、权限、超时或头部过大导致413/500/502/400错误。

要让 Nginx 正确处理超大型请求体(比如大文件上传、巨量 JSON 提交),不能只改一个参数,得从接收、缓存、转发、权限、超时五个环节协同配置。否则容易出现 413、500、502、400 等错误,且日志提示模糊,排查困难。
核心:client_max_body_size 必须精准生效
这个指令控制请求体上限,单位支持 k、m、g(注意必须小写,如 50m,50M 会报错)。它不自动继承父级——如果只在 http 块设了,但请求实际匹配的是某个 location /api/upload,而该 location 没有显式配置,Nginx 就按默认 1M 处理。
- 推荐在具体
location块中设置,例如:location /upload { client_max_body_size 100m; } - 若多个上传路径分散,统一放在
server块更稳妥 - 设为
0可禁用检查,但存在安全风险,不建议生产环境使用
配套:缓冲与临时文件权限必须到位
当请求体超过 client_body_buffer_size(默认 8k 或 16k),Nginx 会写临时文件到 client_body_temp_path 目录。如果该目录属主不对或缺少 w+x 权限,就会报 500 错误并带 Permission denied 日志。
- 查运行用户:
ps aux | grep nginx | grep worker(常见为nginx或www-data) - 查 temp 路径:
nginx -T 2>&1 | grep client_body_temp_path,未显式配置则用默认路径(如/var/lib/nginx/client_body_temp) - 修复权限:
sudo chown nginx:nginx /path/to/client_body_temp && sudo chmod 750 /path/to/client_body_temp - 顺带检查其他 temp 目录:
proxy_temp、fastcgi_temp等,权限逻辑一致
协同:后端与超时参数必须同步放宽
Nginx 放行 ≠ 后端能收。即使 Nginx 接收了 100MB 请求,后端服务(Spring Boot、Express、FastAPI 等)若仍卡在默认 2MB 限制,也会拒绝或超时。
- 后端限制应略小于 Nginx 设置(如 Nginx 设
100m,后端设80m),留出解析开销余量 - 延长关键超时:
client_body_timeout 120s(读 body)、proxy_read_timeout 120s(等后端响应)、proxy_send_timeout 120s - 增大内存缓冲:
client_body_buffer_size 128k可减少磁盘写入,提升稳定性和性能
别漏:请求头过大也会触发类似错误
大量自定义 Header、长 JWT、嵌套代理头可能导致请求头总长超标,Nginx 在解析阶段就断连,报 400 或静默失败,日志里可能只有 client sent too large request。
- 检查 error log 是否有
400 "request header or cookie too large" - 调大头部缓冲:
client_header_buffer_size 4k+large_client_header_buffers 8 16k - 避免无节制增加,长期用过大的值会抬高内存占用


















