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