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;
}

...

1つのドキュメントを消去するCurl

curl https://example.com/site1/overview.jpeg -s -H "X-Purge: true"

関連情報