nginx proxy_cache 缓存失败主因是文件系统权限与 worker 用户身份不匹配;需确保 proxy_cache_path 目录由 nginx 用户拥有 rwx 权限、父目录可遍历,并建议配置 use_temp_path=off 避免跨文件系统问题,selinux 或容器环境还需额外授权。

Nginx 的 proxy_cache 本身不直接控制“读写权限”,真正决定缓存能否成功写入、读取的,是 缓存路径的文件系统权限 和 Nginx worker 进程的运行用户身份。配置代理缓存时若出现“缓存写入失败”“命中率始终为 0”或日志中报 open() "/var/cache/nginx/xxx" failed (13: Permission denied),基本都是权限问题。
缓存路径的目录权限必须正确
proxy_cache_path 指定的根目录(如 /var/cache/nginx/proxy_cache)需满足:
- 目录必须提前手动创建(Nginx 不会自动建多级目录)
- 所有父目录(包括
/var/cache/nginx/)都要可遍历(即对 Nginx 用户有x权限) - 根目录本身必须对 Nginx worker 用户可读、可写、可执行(即
rwx)
例如:
sudo mkdir -p /var/cache/nginx/proxy_cache sudo chown -R nginx:nginx /var/cache/nginx sudo chmod -R 755 /var/cache/nginx
⚠️ 注意:
nginx是常见用户名,实际请确认你的 Nginx 运行用户(查ps aux | grep nginx或/etc/nginx/nginx.conf中user指令,如www-data、nginx、nobody等)
避免跨文件系统写入导致权限异常
Nginx 默认使用临时目录(proxy_temp_path)中转缓存内容,再移动到最终缓存路径。如果 proxy_temp_path 和 proxy_cache_path 在不同挂载分区(比如 /tmp 是 tmpfs,而 /var/cache 是 ext4),rename() 移动操作会失败,降级为拷贝+删除,此时可能因目标目录权限不足或 SELinux/AppArmor 限制导致写入失败。
✅ 推荐做法:禁用临时中转,直写缓存目录
在 proxy_cache_path 行末加 use_temp_path=off:
proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2 keys_zone=my_cache:10m max_size=2g inactive=60m use_temp_path=off;
这样可绕过 proxy_temp_path 权限干扰,也提升 I/O 效率。
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
SELinux 或容器环境需额外放行
-
SELinux 启用时(如 CentOS/RHEL),默认禁止 Nginx 写入非标准路径。需打标:
sudo semanage fcontext -a -t httpd_cache_t "/var/cache/nginx/proxy_cache(/.*)?" sudo restorecon -Rv /var/cache/nginx/proxy_cache
-
Docker 或 Podman 容器中:确保挂载缓存目录时启用读写权限,且宿主机路径已赋权:
docker run -v /host/cache:/var/cache/nginx/proxy_cache:rw ...
验证权限是否生效的快速方法
-
查看 Nginx worker 用户:
ps aux | grep 'nginx: worker' # 输出类似:nginx 12345 0.0 0.2 123456 7890 ? S Oct01 0:01 nginx: worker process
-
切换到该用户,手动测试写入:
sudo -u nginx touch /var/cache/nginx/proxy_cache/test_write sudo -u nginx rm /var/cache/nginx/proxy_cache/test_write
若报错
Permission denied,说明权限未配好。 -
检查 Nginx 错误日志:
tail -f /var/log/nginx/error.log # 关注含 "cache", "Permission denied", "open() failed" 的行
不复杂但容易忽略。










