nginx缓存不生效、返回502或内容长度错误且error.log出现(13: permission denied),主因是proxy_cache_path与proxy_temp_path权限或路径配置不当;需确保二者同文件系统、nginx worker用户有完整读写执行权限、每级父目录含x权限,并显式配置统一路径。

遇到 Nginx proxy_cache 不写入缓存、返回 502 或内容长度错误,且 error.log 出现 (13: Permission denied),基本就是缓存目录权限没走通。核心不是“文件能不能读”,而是“Nginx 工作进程有没有资格走进去、并在里面建临时文件”。排查要从日志定位路径开始,一层层往下验。
看 error.log 锁定具体失败路径
打开 /var/log/nginx/error.log,找类似这样的报错:
-
[error] open() "/var/cache/nginx/proxy_temp/0000000001" failed (13: Permission denied)→ 临时目录不可写 -
[error] stat() "/var/cache/nginx" failed (13: Permission denied)→ 缓存主目录不可进入(缺 x 权限) -
[crit] mkdir() "/var/cache/nginx/proxy_temp/8/00" failed (13: Permission denied)→ 子目录创建失败,通常因上级目录缺 x 或 w
括号里的 (13: Permission denied) 是 Linux 系统级错误,可信度高,不用怀疑配置语法问题。
确认 worker 进程真实用户,并核对目录归属
Nginx 主进程常是 root,但干活的是 worker 进程——它的用户才决定权限边界:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
- 运行
ps aux | grep "nginx: worker process",看 USER 列(常见为www-data、nginx或_www) - 别只信
nginx.conf里的user指令——它可能被注释、被include覆盖,或根本没生效 - 用该用户模拟访问:
sudo -u www-data ls -ld /var/cache/nginx,如果报错,说明连目录都进不去
再用 ls -ld /var/cache/nginx /var/cache/nginx/proxy_temp 查属主和属组,第三列(owner)和第四列(group)必须与上面查到的 worker 用户一致。
逐级检查执行权限(x)和写入权限(w)
Linux 要求从 / 开始,每一级父目录都得有 x 权限,Nginx 才能“走进去”。只改目标目录权限没用:
- 运行
namei -l /var/cache/nginx/proxy_temp,会清晰列出/→/var→/var/cache→/var/cache/nginx→/var/cache/nginx/proxy_temp每一级的权限、属主、属组 - 重点看中间某一级是不是
drw-r--r--(无 x)、drwxr-x---(others 无 x,而 worker 属于 others) - 最终目标目录(如
proxy_temp)还需有w权限,否则无法创建临时文件
检查 proxy_cache_path 和 proxy_temp_path 是否匹配
这两个路径必须满足三个硬性条件:
- 在同一个挂载点(同文件系统),否则无法原子移动临时文件
- 都对 worker 用户可读、可写、可进入(即每级都有 x)
- 磁盘空间充足,且挂载选项不含
noexec、nosuid或ro
常见坑:配置里 proxy_cache_path 指向 /var/cache/nginx,但 proxy_temp_path 被注释,Nginx 就会退回到默认的 /tmp(不同分区),导致 13 错误。务必显式配置并统一路径,例如:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mycache:10m max_size=1g;










