CentOS7部署的Nginx1.20配置缓存后/var/nginx/cache文件夹为空如何解决
核心配置错误
- 你当前配置的
proxy_cache仅对使用proxy_pass的反向代理请求生效,你的站点PHP请求走的是fastcgi_pass转发到PHP-FPM,需要使用fastcgi_cache系列缓存指令,这是缓存目录为空的最主要原因。
上游响应头影响缓存
从你返回的响应头可以看到PHP默认返回了禁止缓存的头:
Cache-Control: no-store, no-cache, must-revalidate
Set-Cookie: LS-ROKZXDGTYMXRJVMG=f0ljvjpnfs0kg6m1idhkolrfho; path=/; secure; HttpOnly
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Nginx默认不会缓存带有Set-Cookie头、Cache-Control为no-store/no-cache、Expires早于当前时间的响应,即使缓存指令配置正确也不会写入缓存。
权限检查
先确认/var/nginx/cache目录的所有者为nginx用户,读写权限正常,执行命令:chown -R nginx:nginx /var/nginx/cache && chmod -R 700 /var/nginx/cache
修改后的配置示例
1. 修改http块的缓存配置
替换你原来的proxy_cache相关配置为fastcgi缓存配置:
http { # 把原来的proxy_cache_path换成fastcgi_cache_path fastcgi_cache_path /var/nginx/cache levels=1:2 keys_zone=CACHE:10m max_size=20g; # 全局或者指定location配置fastcgi缓存 fastcgi_cache CACHE; fastcgi_cache_valid 200 10m; # 忽略上游的缓存控制头,按我们配置的规则缓存 fastcgi_ignore_headers Cache-Control Expires Set-Cookie; # 可选:添加响应头查看缓存命中状态 add_header X-Cache-Status $upstream_cache_status; # 其余原有配置保持不变 # ... }
2. 按需配置缓存生效范围
如果不需要缓存所有PHP请求,可以把fastcgi_cache相关配置放到需要缓存的location ~ \.php$块内,避免缓存动态接口、用户中心等个性化页面。
3. 验证配置生效
修改配置后执行nginx -t检查语法,没问题执行systemctl reload nginx重载配置,再次访问站点查看响应头的X-Cache-Status字段,首次访问为MISS,第二次访问为HIT即代表缓存生效,同时可以查看/var/nginx/cache目录已经生成缓存文件。
内容的提问来源于stack exchange,提问作者Vicente

