nginx代理缓存失败多因权限问题:检查error.log中“(13: permission denied)”错误,确认worker用户与/var/cache/nginx目录属主一致,逐级验证路径执行权限(x),并确保proxy_cache_path与proxy_temp_path在同一文件系统。

遇到 Nginx 代理缓存写不进去、返回 500 或 ERR_CONTENT_LENGTH_MISMATCH 等问题,十有八九是缓存目录权限没配对。不用猜配置有没有写错,先盯住系统权限这一环——它比语法错误更隐蔽,也更容易修。
看 error.log 里是不是反复报 Permission denied
打开 /var/log/nginx/error.log,搜索关键词:
open() "/path/to/proxy_temp/..." failed (13: Permission denied)
或
stat() "/var/cache/nginx" failed (13: Permission denied)
括号里的 (13: Permission denied) 是 Linux 系统级错误码,说明 Nginx 工作进程连目录都进不去、文件都打不开,不是配置问题,是实打实的权限拦路。
查清楚 Nginx 工作用户和实际目录归属是否一致
运行这两条命令:
-
ps -eo user,comm | grep nginx | grep -v root → 看 worker 进程用的是哪个用户(常见为
www-data或nginx) - ls -ld /var/cache/nginx /var/cache/nginx/proxy_temp → 看目录第三列(属主)和第四列(属组)是不是跟上面一致
如果目录属主是 root,而 worker 是 www-data,那缓存肯定写失败——Nginx 不会越权操作。
逐级检查路径上每一层有没有执行权限(x)
Linux 要求从 / 开始,每一级父目录都得有 x 权限,Nginx 才能“走进去”。只改最后一层没用。
- 用 namei -l /var/cache/nginx/proxy_temp 查看整条路径每级的权限
- 重点看中间某一级是不是
drwxr-x---(others 没 x),哪怕只是/var/cache这一级没 x,整个子目录就不可访问 - 修复:给缺失 x 的父级补上,比如 sudo chmod 755 /var/cache
确认 proxy_cache_path 和 proxy_temp_path 在同一文件系统且可写
Nginx 缓存要求两个路径必须在同一个挂载点下,否则无法原子移动临时文件。常见坑:
-
proxy_cache_path设在/var/cache/nginx,但proxy_temp_path被注释或默认落到/tmp(不同磁盘) - 用 df -h /var/cache/nginx /tmp 看是否同分区
- 修复建议:统一指定两者到同一路径,例如:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=mycache:10m;proxy_temp_path /var/cache/nginx/proxy_temp;











