nginx 的 location 块不直接处理文件上传,而是通过匹配上传路径(如 /upload/、正则或精确匹配)并将请求转发给后端(php-fpm、node.js 等)来实现;需配置 client_max_body_size 等参数,并避免误用 root/alias。

Nginx 的 location 块本身不直接处理文件上传,而是通过路由规则将上传请求转发给后端应用(如 PHP、Python 或 Node.js 服务),或配合 proxy_pass、fastcgi_pass 等指令完成路径映射。关键在于:用 location 匹配上传路径,再将请求交给能真正处理上传逻辑的后端,同时注意客户端上传参数(如 client_max_body_size)的配置。
匹配上传路径的 location 规则
根据 URL 路径决定哪些请求属于“文件上传”,常见写法:
-
location /upload/ { ... }—— 匹配以/upload/开头的所有请求,适合统一上传入口 -
location ~ ^/api/upload$ { ... }—— 使用正则精确匹配 API 路径,避免误匹配 -
location = /upload.php { ... }—— 严格匹配单个脚本,适用于传统 PHP 上传入口
转发到后端处理上传逻辑
匹配成功后,需把请求交由实际处理上传的程序。例如:
- 转给 PHP-FPM:
fastcgi_pass 127.0.0.1:9000;,并确保fastcgi_param SCRIPT_FILENAME指向正确的上传脚本(如$document_root/upload.php) - 代理到 Node.js 服务:
proxy_pass http://localhost:3000;,后端框架(如 Express + multer)负责接收和保存文件 - 若用 Nginx 自身模块(如
nginx-upload-module,已不推荐),需额外编译安装,并用upload_pass指令指定处理路径
必须调整的上传相关配置
默认 Nginx 对请求体大小有限制,上传大文件前务必检查:
-
client_max_body_size 100M;—— 放在http、server或location块中,根据需要设置上限 -
client_body_buffer_size 128k;—— 设置内存缓冲区大小,过小会导致频繁写临时文件 -
client_body_temp_path /var/tmp/nginx_client_body;—— 指定上传临时文件存放目录,确保该路径存在且 Nginx 用户有写权限
避免常见陷阱
上传路径映射看似简单,但容易出错:
- 不要在
location中直接用root或alias指向上传目录——这只会让 Nginx 尝试返回文件,而非接收上传 - 注意
alias和root在路径拼接上的差异:比如location /upload/ { alias /data/uploads/; }会把/upload/file.jpg映射到/data/uploads/file.jpg;而root会拼成/data/uploads/upload/file.jpg - 如果前端使用 FormData 提交,确保后端能正确解析
multipart/form-data,Nginx 不参与解析,只负责透传











