Nginx 上传返回 413,怎样检查请求体大小限制?
Nginx 上传返回 413 时,先用同一请求的访问日志和错误日志确认由哪一层拒绝,再检查实际命中的 server、location 及 client_max_body_size。该指令限制整个客户端请求体,修改后需要在正确实例检查并重载配置,再用边界请求验证。
适用版本与排查前提
本文面向 Linux 上的 Nginx 1.24 及以上 HTTP 部署,依据发布时查阅的官方文档整理,未在目标服务器实测。先记录版本、二进制和配置路径,容器或面板部署应进入对应管理范围。示例路径、上传地址和容量均需按业务替换。
nginx -v
nginx -V
sudo nginx -T-v 显示版本,-V 显示编译参数,-T 检查并输出配置文件,适合核对 include 与配置上下文。若实际进程使用 -c 或 -p,检查时也要使用相同参数,不能把另一套安装的结果当成线上配置。参数定义见 Nginx 官方命令行说明。输出可能包含内部地址或敏感配置,分享前应脱敏。
第一步,确认实际拒绝请求的环节
- 记录失败时间、域名、路径、方法、文件大小和客户端返回状态。
- 在入口代理、当前 Nginx 和应用日志中寻找同一请求,尽量使用现有请求标识关联。
- 核对是否只有大请求失败、小请求成功,以及同一文件是否因入口不同得到不同结果。
前置网关、CDN 和应用也可能有大小限制。响应头或错误页外观只能作为线索,最终应与各层日志对应。只修改当前 Nginx,不能证明其他层会接受相同请求。
第二步,核对请求体限制及命中位置
client_max_body_size 默认值为 1m,可配置在 http、server 或 location。请求体超过配置值时返回 413,设为 0 会关闭这项检查。定义见 官方请求体大小限制说明。
沿实际请求的虚拟主机和路径检查配置,尤其注意更具体的 location 或内部跳转。不要只搜索到一个较大的值就认为请求一定采用它。若是分片上传,服务端实际收到的请求结构还需结合客户端协议核查。
在已经确认命中的上传 location 内,可采用类似下面的单条配置。它是需要合并到现有块中的片段,不能直接替换整个站点配置。
# 在现有上传 location 内按业务容量设置
client_max_body_size 20m;20m 是示例请求体上限,不是通用上传标准。表单上传的整个请求体还包含字段与封装数据,不能把文件标称大小直接视为总请求体大小。应与应用上限、临时存储和并发容量一起确定允许范围。
第三步,检查配置并通过原管理入口重载
sudo nginx -t
sudo nginx -s reload先单独执行第一条,只有检查成功且变更条件满足时才执行第二条。-t 检查语法并尝试打开引用文件,reload 通知运行实例重新读取配置。自定义配置与前缀需保持一致,见 官方参数定义。面板或服务管理器托管时,使用已经核对过的原管理入口。
master 收到重载后尝试应用新配置,成功后启动新 worker 并让旧 worker 完成已有请求后退出。应用失败时会继续使用原配置,因此还应核对重载日志和真实请求结果,参阅 Nginx 官方重载流程。
验证方法与常见问题
- 在受控环境用相同客户端、相同域名与路径测试小请求、符合业务上限的请求和超过上限的请求。
- 同时核对 Nginx、前置代理和应用日志,确认请求最终由预期层处理。
- 检查文件是否完整保存、应用是否成功处理,并确认超限请求仍按预期拒绝。
- 记录变更前后配置、时间、状态和结果,出现异常时恢复本次修改并重新检查与重载。
把限制调大后仍返回 413 怎么办?
回到请求链路,确认是否重载成功、是否修改正确实例、是否命中了其他 location,以及拒绝是否来自前置层或应用。不要连续放大多个未知限制来试错。
调整 client_body_buffer_size 可以替代大小上限吗?
该指令控制读取请求体的缓冲区,超过缓冲区时请求体可写入临时文件,它与 client_max_body_size 的最大允许大小职责不同,见 官方请求体缓冲说明。增大缓冲区还需评估并发内存,不能作为通用的 413 修复。
配置路径或重载存在疑问时,可先阅读本站 Nginx 配置检查与安全重载排查。本文为资料整理,未执行生产变更或上传测试,没有提供虚构成功输出。
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭