报错“open() ... failed (13: permission denied)”本质是nginx worker进程无权在client_body_temp目录创建文件,需确认实际路径与用户、创建目录、正确chown/chmod,并排查selinux/apparmor干扰及client_max_body_size限制。

报错“open() ... failed (13: Permission denied)”,本质是 Nginx worker 进程没权限在 client_body_temp 目录里创建临时文件。这不是配置写错了,而是系统层面的归属和权限没对上——修对了,上传大文件、图片、表单数据就自然通了。
确认实际使用的临时目录和运行用户
别凭印象猜路径或用户,得看真实配置:
- 运行
nginx -T | grep client_body_temp_path查出当前生效的路径(未显式配置时,默认路径通常是/var/nginx/client_body_temp或/var/run/nginx/client_body_temp) - 查
user指令:执行grep "user " /etc/nginx/nginx.conf,常见值为www-data、nginx或root - 验证进程身份:用
ps aux | grep nginx看 worker 进程实际属主,以它为准
创建目录并设对归属与权限
路径存在、属主正确、权限够用,三者缺一不可:
- 若目录不存在,先建:
sudo mkdir -p /var/nginx/client_body_temp(路径必须和上一步查到的一致) - 改属主:
sudo chown www-data:www-data /var/nginx/client_body_temp(把www-data替换为你的真实 worker 用户) - 设权限:
sudo chmod 700 /var/nginx/client_body_temp(仅属主可读写执行,安全且满足需求;切勿用 777)
检查 SELinux 或 AppArmor 干扰
权限看着对,但还是报错?可能是安全模块拦住了:
- CentOS/RHEL(SELinux):运行
sudo ausearch -m avc -ts recent | grep nginx,若看到avc: denied,执行:sudo semanage fcontext -a -t httpd_var_run_t "/var/nginx/client_body_temp(/.*)?"sudo restorecon -Rv /var/nginx/client_body_temp - Ubuntu(AppArmor):运行
sudo aa-status | grep nginx,若处于 enforce 模式,编辑/etc/apparmor.d/usr.sbin.nginx,在已有/var/nginx/** rw,行附近补充一行:/var/nginx/client_body_temp/** rw,,然后sudo systemctl reload apparmor
别漏掉 client_max_body_size 配置
权限修好了,但上传仍失败?可能被大小限制卡住:
- 错误日志若出现
client intended to send too large body,说明触发了client_max_body_size - 在对应
location块里加一行,例如:client_max_body_size 100m;(单位必须写,不能只写数字) - 改完务必执行
nginx -t && nginx -s reload,否则不生效











