我使用 nginx 作为反向代理和缓存。目前,位置“/test”的缓存将每 2 小时更新一次:“proxy_cache_valid 200 302 301 304 2h;”
如果文件发生变化,是否可以仅更新缓存?
谢谢你!
答案1
这应该由您自行处理。
如果文件缓存在浏览器中,并且浏览器再次请求该文件,并且该文件已从服务器缓存中清除,则服务器仍将查看if-modified-since
请求中的标头。
服务器将检查该日期时间值,如果确定没有发生更改,则服务器将发送响应304
,告诉浏览器可以加载缓存版本,并且实际对象不会在服务器上再次下载。
如果该值发生变化,则对象将被服务器和缓存副本更新。
https://www.keycdn.com/support/if-modified-since-http-header
恕我直言,您真正应该控制的是Cache-Control
缓存标头,而不是服务器配置。
当 Cache-Control 不存在或者配置不合理时,服务器配置选项可作为一种故障保护措施。
答案2
我假设我们正在讨论生成的内容还不是您的 Web 服务器上的静态文件(您的 Web 服务器上的静态文件通常足够快)。
主要问题是如何让 Nginx 知道缓存内容已经改变。
重新验证听起来不错,但也有影响,即检查更新的过程与生成更新一样昂贵。所以这不是一个真正的选择。
最佳做法是,如果内容已更新(例如,已在 CMS 中更改),则清除内容。清除是使缓存对象无效的过程。Nginx 仅在 NginxPlus 版本中支持清除。但是,您可以通过重新加载缓存对象来执行几乎相同的操作。
以下是简单的操作方法:
Nginx 配置
...
# default location
location / {
try_files $uri @php;
}
# PHP handler
location @php {
try_files $uri /index.php;
access_log /var/log/nginx/access.log;
# include fastcgi_params
include fastcgi_params;
# how to connect to PHP-FPM
fastcgi_pass php-fpm;
# enable caching
fastcgi_cache phpfpm;
# don't look for existing cache objects with HTTP header X-Purge
fastcgi_cache_bypass $http_x_purge;
}
...
Curl 清除一个文档
curl https://example.com/site1/overview.jpeg -s -H "X-Purge: true"