应在server块中配置client_max_body_size以实现整站统一且安全的请求体限制,推荐值为50m~100m(图文文档)、12m(分片上传)、200m~1g(工程包/视频),并同步调整timeout、buffer_size、temp_path等参数防攻击。

在 Server 块中配置客户端请求体大小限制,核心是用 client_max_body_size 指令设一个既满足业务、又守住安全边界的阈值,而不是盲目放大或全局放开。
为什么推荐在 Server 块中设(而非 http 或 location)
Server 块级配置能覆盖该虚拟主机下所有路径,同时避免被子 location 覆盖(比如某些 location 未显式声明时会继承 server 的值),也比 http 块更可控——不会误放开其他站点。适合整站需统一上传能力(如企业文档平台、内部视频系统)的场景。
- 若只开放 /upload 接口大上传,应改用 location 块,更精准
- 若含管理后台、API 管控接口等敏感路径,不建议在 server 块放宽,防止被滥用
- 多租户或多站点共用 Nginx 时,server 级配置比 http 级更安全
设多少才算“安全合理”的阈值
数值不是越大越安全,而是略高于真实最大单次请求体,并预留缓冲余量。超限即 413 拦截,不进后端、不占磁盘临时文件、不触发慢速攻击风险。
- 普通图文/文档系统:50M~100M 已足够
- 分片上传场景:按最大单片大小 × 1.2,例如单片上限 10MB → 设为 12M
- 工程包或高清视频上传:200M~1G,但必须同步确认 client_body_temp_path 所在磁盘有足够空间且权限正确
- 严禁设为 0:等于关闭第一道防护,攻击者可构造超大 payload 耗尽 worker 内存或 inode
必须同步调整的配套参数
只改 client_max_body_size 不够。大请求体传输耗时长、数据量大,需协同收紧时间窗、控制缓存行为,防慢速攻击和代理层资源耗尽。
- client_body_timeout 120s:从收到请求头后开始计时,body 数据中断超时即断连,防低速分段发送
- client_body_buffer_size 512k:设为内存缓冲上限,太大浪费内存,太小频繁刷盘易引发 500 错误
- proxy_read_timeout 600 和 proxy_send_timeout 600:确保后端处理大请求时不被代理层主动断开
- client_body_temp_path /var/tmp/nginx/client_body 1 2:显式指定临时目录,保证有写权限且 inode 充足
配置示例(可直接套用)
以下是一个生产可用的 server 块片段,适用于文档类系统:
server {listen 443 ssl;
server_name docs.example.com;
client_max_body_size 100M;
client_body_timeout 180s;
client_body_buffer_size 512k;
client_body_temp_path /var/tmp/nginx/client_body 1 2;
proxy_read_timeout 600;
proxy_send_timeout 600;
location / {
proxy_pass http://backend;
}
}











