必须在匹配上传路径的location块中配置client_max_body_size、client_body_timeout等参数,同步调优proxy_read_timeout、client_body_buffer_size及权限设置,否则仍会因缓冲、超时或权限问题导致413/408错误。

在 Nginx 中,大文件上传需要单独设置超时参数,否则默认的 client_max_body_size、client_body_timeout、send_timeout 等值会限制上传过程,导致 413 或 408 错误。关键在于:**不能只靠全局配置,必须结合 location 块精准匹配上传路径,并在其中覆盖超时和大小限制**。
匹配上传接口的 location 路径
用精确匹配(=)或前缀匹配(^~)锁定上传入口,避免被其他 location 覆盖:
- 推荐用
^~ /api/upload匹配所有以该路径开头的上传请求 - 若接口固定,如
/upload/file,可用= /upload/file精确匹配,优先级最高 - 避免用正则
~匹配,除非路径含动态参数且必须捕获;正则匹配优先级低于^~和=,易出错
在 location 内覆盖关键上传参数
这些指令必须写在匹配的 location 块内才生效,全局设置不会自动继承到子块:
-
client_max_body_size 2G;—— 允许最大请求体大小,单位可为k、m、g;设为0表示不限制(不推荐) -
client_body_timeout 300s;—— 客户端发送请求体的超时时间,大文件需调高(如 300 秒) -
client_header_timeout 60s;—— 请求头读取超时,一般保持默认或略增 -
send_timeout 300s;—— Nginx 向客户端发送响应的超时,上传完成后返回结果时可能用到
后端代理场景下补充 upstream 超时
如果上传请求被反向代理到后端(如 Python/Node.js 服务),还需在 proxy_pass 块中延长代理超时:
-
proxy_connect_timeout 60s;—— 连接上游的超时 -
proxy_send_timeout 600s;—— 发送请求(含文件体)给上游的超时 -
proxy_read_timeout 600s;—— 等待上游响应的超时 - 注意:
proxy_buffering off;可选,避免 Nginx 缓冲整个大文件再转发(节省内存,但需后端支持流式接收)
验证与调试要点
配置生效后需主动验证,避免“以为配了其实没生效”:
- 用
nginx -t检查语法,nginx -s reload平滑重载 - 上传一个略大于默认限制(如 10M)的文件,观察是否仍报 413 Request Entity Too Large
- 用
curl -v -F "file=@large.zip" http://your.site/api/upload查看响应头和状态码 - 检查 Nginx error log(
error_log /path/to/error.log warn;),超时通常记录为upstream timed out或client timed out


















