核心是确认Nginx工作用户对缓存路径及其所有父目录具备x(进入)和w(写入)权限,报错(13: Permission denied)表明系统级权限拦截;需依次检查user指令、ps验证实际用户、ls -ld确认属主与权限、逐级验证x权限、chown/chmod修复、sudo -u模拟测试,并排查SELinux/AppArmor限制。

排查 Nginx proxy_cache 缓存目录权限问题,核心是确认 Nginx 工作进程(通常是 www-data、nginx 或 daemon 用户)对缓存路径及其父目录拥有读、写、执行权限。权限不足时,Nginx 日志中通常会出现 open() "/path/to/cache/xxx" failed (13: Permission denied) 类错误。
检查 Nginx 运行用户和缓存路径归属
先确认 Nginx 是以哪个用户身份运行:
- 查看主配置文件(如
/etc/nginx/nginx.conf)开头的user指令,例如:user www-data;;若未设置,默认为nobody(Linux 下常为nginx或www-data) - 用命令验证实际运行用户:
ps -eo user,comm | grep nginx | grep -v grep - 确认
proxy_cache_path配置中的路径(如/var/cache/nginx/proxy_cache),并检查该路径所有者和权限:ls -ld /var/cache/nginx/proxy_cache
确保目录具备完整三级权限(owner + parent + cache dir)
缓存写入需满足:Nginx 用户对缓存路径本身、其每一级父目录(直到根)都具备 x(执行)权限(用于进入目录),且对缓存目录本身有 rwx 权限(创建子目录、写入文件)。常见漏点是父目录(如 /var/cache/nginx)权限不足:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
-
/var和/var/cache一般没问题(系统默认 755) - 但
/var/cache/nginx若为 root 所有且权限为700,则www-data无法进入,导致缓存目录无法初始化 - 执行:
sudo chown -R www-data:www-data /var/cache/nginx/proxy_cache(假设用户为 www-data) - 同时设父目录可进入:
sudo chmod 755 /var/cache/nginx
验证缓存目录是否可被 Nginx 创建和写入
手动模拟 Nginx 行为测试:
- 切换到 Nginx 用户:
sudo -u www-data bash(或对应用户) - 尝试在缓存路径下创建临时文件:
touch /var/cache/nginx/proxy_cache/test.tmp - 尝试创建子目录:
mkdir -p /var/cache/nginx/proxy_cache/testdir - 若任一操作报
Permission denied,说明权限链仍有断点
检查 SELinux 或 AppArmor(仅限启用安全模块的系统)
在 CentOS/RHEL(SELinux)或 Ubuntu(AppArmor)上,即使文件权限正确,安全策略也可能拦截写入:
- CentOS/RHEL:
sudo ausearch -m avc -ts recent | grep nginx,查看是否有拒绝日志;临时放行测试:sudo setsebool -P httpd_can_network_connect 1,或为缓存路径打标签:sudo semanage fcontext -a -t httpd_cache_t "/var/cache/nginx(/.*)?",再restorecon -Rv /var/cache/nginx - Ubuntu:
sudo aa-status | grep nginx查看是否启用;检查/etc/apparmor.d/usr.sbin.nginx是否包含缓存路径的写入规则,如缺少则添加类似/var/cache/nginx/** rwk,并重载:sudo systemctl reload apparmor

















