nginx 的 client_max_body_size 可在 location 块中单独设置以覆盖 server 级默认值,需确保精确或前缀匹配、避免被更宽泛规则覆盖,并同步调整后端限制;配置后需重载并用 curl 和错误日志验证。

Nginx 的 client_max_body_size 默认作用于整个 server 块,但你可以通过在特定 location 块中单独设置它,来为某个上传接口(比如 /api/upload)放宽限制,而其他路径保持默认值(如 1MB)。
只在目标 location 中覆盖 client_max_body_size
关键点是:该指令支持在 http、server 和 location 级别使用,且 location 级别的配置会覆盖上级作用域的值。因此,你只需在对应接口的 location 块内显式声明即可:
- 确保该
location是精确匹配或前缀匹配,避免被更宽泛的规则覆盖 - 值可写为
100M、2G等,单位不区分大小写 - 若上游有代理(如转发到后端服务),还需确认后端(如 Node.js、Python)自身也允许同样大小的请求体
典型配置示例
假设你要放开 /api/v1/upload 接口至 200MB,其余接口维持默认 1MB:
server {
client_max_body_size 1m; # 全局默认限制
<pre class="brush:php;toolbar:false;">location /api/v1/upload {
client_max_body_size 200m;
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location / {
# 其他接口沿用 server 级别的 1m 限制
proxy_pass http://backend;
}}
注意 location 匹配优先级
如果存在多个可能匹配的 location,Nginx 按以下顺序选择(高优先级优先):
- 精确匹配(
= /api/upload) - 最长前缀匹配(
location /api/upload/) - 正则匹配(
~* \.(jpg|png)$),按配置文件中出现顺序
若你的上传接口被某个更宽泛的正则 location 拦截(例如 location ~ \.php$),则 client_max_body_size 不会生效——需调整顺序或改用更精准的匹配方式。
验证是否生效
修改后重载 Nginx(nginx -s reload),再通过 curl 测试:
curl -X POST http://your-domain.com/api/v1/upload \ -F "file=@large-file.zip" \ -v
观察响应头和错误日志:/var/log/nginx/error.log 中若出现 413 Request Entity Too Large,说明配置未命中目标 location;若成功接收,则说明已生效。










