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 版本中支援 Purge。但是,您可以透過重新載入快取的物件來執行幾乎相同的操作。

這是一個簡單的操作方法:

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 https://example.com/site1/overview.jpeg -s -H "X-Purge: true"

相關內容