时间:2026-05-26来源:www.dnxitongcheng.com作者:电脑系统城
业务反馈文件上传接口 /api/v1/upload 在处理部分文件是时返回 500 错误。
通过实时查看 Nginx 日志error.log,发现核心报错信息:
| 1 | open() "/usr/local/nginx/client_body_temp/00000000142" failed (13: Permission denied) |
同时 access.log 中对应请求状态码为 500,确认是 Nginx 层面权限问题导致上传失败。
通过进程命令确认 Nginx 实际运行用户:
| 1 | ps aux | grep nginx |
结果显示 Nginx master/worker 进程均由 work 用户运行,而非默认的 nginx
进入 Nginx 根目录,查看临时目录权限:
| 1 | cd /usr/local/nginx && ll |
发现关键问题:
client_body_temp 目录所有者为 nobody,权限为 drwx------
work 用户无写入权限,导致 Nginx 无法存储上传文件临时数据
Nginx 运行用户为 work,但所有临时目录的所有者/权限未同步修改,导致:
client_body_temp 创建临时文件很多同学会疑惑:为什么有的小文件能上传成功,大文件却报错?这核心和 Nginx 的 client_body_buffer_size 配置相关,也是部分文件能正常运行的关键原因。
首先明确该配置的作用:client_body_buffer_size 用于设置 Nginx 接收客户端请求体(即上传文件、表单数据等)时,在内存中开辟的缓冲区大小。
当上传文件小于等于该缓冲区大小时:Nginx 会直接将文件数据存放在内存缓冲区中,无需写入 client_body_temp 临时目录,因此即使该目录权限异常,小文件上传也能正常执行。
当上传文件大于该缓冲区大小时:Nginx 会将超出内存缓冲区的部分,临时写入 client_body_temp 目录,此时若该目录权限不足(所有者不匹配、无写入权限),就会触发 Permission denied 错误,返回 500 状态码。
默认情况下,client_body_buffer_size 配置值通常为 16k 或 32k(不同 Nginx 版本略有差异),这也是为什么小文件能正常上传、大文件报错的核心原因——小文件未触发临时目录写入,避开了权限问题。
补充建议:
若业务中存在大量大文件上传,可适当调大 client_body_buffer_size(如设置为 100m),减少临时目录写入频率,但仍需确保 client_body_temp 目录权限正常,避免极端场景下的报错。
示例配置如下:
| 1 | client_body_buffer_size 100m; # 按需调整,过大可能占用过多内存 |
除了 client_body_buffer_size,还有一个关键配置 client_body_max_size,负责限制客户端上传文件的最大大小,这也是部分文件能上传、部分文件失败的另一个核心原因,容易与权限问题混淆。
先明确两者区别,避免混淆:
client_body_buffer_size:控制「内存缓冲区大小」,决定文件是否需要写入临时目录(和权限相关);
client_body_max_size:控制「上传文件的最大允许大小」,超过这个值直接拒绝上传,和权限无关。
若仅调大 client_body_max_size,未修正 client_body_temp 权限,大文件(超过缓冲区大小)仍会报 500 权限错误;
若仅修正权限,未调大 client_body_max_size,超过限制的文件会报 413 错误,无法上传;
两者需配合配置,才能确保不同大小的文件都能正常上传,同时避免权限和大小限制导致的报错。
执行以下命令,将 Nginx 所有临时目录及核心文件归属给运行用户 work:
| 1 2 |
chown -R work:root /usr/local/nginx/chmod -R 755 client_body_temp |
| 1 | ./sbin/nginx -s reload |
| 1 | ./sbin/nginx -s reload |
2024-07-07
myeclipse怎么导入tomcat教程2024-07-07
myeclipse如何启动tomcat2024-07-07
myeclipse如何绑定tomcat上线了一个小的预约程序,配置通过Nginx进行访问入口,默认的日志是没有请求时间的,因此需要配置一下,将每一次的请求的访问响应时间记录出来,备查与优化使用....
2023-03-17