nginx代理写缓存失败的典型表现是返回500/502且error.log出现(13: permission denied),根本原因是缓存目录属主为root而worker进程以www-data等普通用户运行,导致无权读写;需检查worker用户、缓存目录属主及逐级路径x权限,并确保proxy_cache_path与proxy_temp_path同文件系统且权限一致。

遇到 Nginx 代理写缓存失败,最典型的表现是请求返回 500 或 502,同时 error.log 里反复出现 (13: Permission denied),指向 /var/cache/nginx/proxy_temp/ 或 /var/cache/nginx/proxy/ 下的路径——这基本就是缓存文件权限被改成了 root,而 Nginx worker 进程以普通用户(如 www-data 或 nginx)运行,导致无权读写。
看 error.log 锁定具体报错路径和错误码
直接打开错误日志:
sudo tail -f /var/log/nginx/error.log- 重点找含
open()、stat()、rename()失败的日志,例如:[error] open() "/var/cache/nginx/proxy_temp/0000000001" failed (13: Permission denied) while reading upstream[error] stat() "/var/cache/nginx/proxy" failed (13: Permission denied) - 括号里的
(13: Permission denied)是 Linux 系统级权限拒绝,不是配置语法错误,可信度高
查 Nginx 工作用户和缓存目录实际归属
两步必须同步验证:
- 确认 worker 进程运行用户:
ps -eo user,comm | grep nginx | grep -v master(看非 master 的 worker 行)
或检查nginx.conf开头的user指令,如user www-data; - 检查缓存路径属主属组:
ls -ld /var/cache/nginxls -l /var/cache/nginx/proxy_templs -l /var/cache/nginx/proxy
如果输出中第三列(属主)是root,而 worker 是www-data,就必然失败
逐级检查父目录可执行权限(x 权限不能漏)
Nginx 要“走进去”缓存目录,从 / 开始每一层都得有 x 权限。只改最后一层没用。
- 用这条命令看清整条路径权限断点:
namei -l /var/cache/nginx/proxy_temp - 重点关注中间某一级是否是
drwxr-x---(others 没x),比如/var/cache权限是drwx------,那www-data就进不去整个/var/cache/nginx - 修复示例:
sudo chmod 755 /var/cachesudo chmod 755 /var/cache/nginx
验证 proxy_cache_path 和 proxy_temp_path 是否同文件系统且权限一致
Nginx 缓存依赖两个路径协同工作,不同磁盘或挂载点会引发原子操作失败。
- 在
nginx.conf中确认:proxy_cache_path /var/cache/nginx/proxy ...proxy_temp_path /var/cache/nginx/proxy_temp;
两者路径前缀必须一致(推荐都放在/var/cache/nginx下),且不能一个在/、一个在/tmp - 检查是否同挂载点:
df -h /var/cache/nginx /var/cache/nginx/proxy_temp
输出的Filesystem列必须相同 - 确保两个目录归属和权限完全一致:
sudo chown -R www-data:www-data /var/cache/nginxsudo chmod -R 755 /var/cache/nginx











