Nginx:仅当文件发生变化时才刷新缓存 - 可能吗?

Nginx:仅当文件发生变化时才刷新缓存 - 可能吗?

我使用 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"

相关内容