複数のバージョンのサイトをキャッシュするNginxまたはVarnish

複数のバージョンのサイトをキャッシュするNginxまたはVarnish

私はウェブサイトを持っています(https://mediacru.sh) にはいくつかのバージョンがあります。通常のデスクトップ サイト、ダーク テーマの同じサイト、モバイル サイトがあります。これらはすべて同じ URL を共有しています。テーマは Cookie で選択され、ユーザー エージェントに基づいてモバイル バージョンが表示されます。

ご覧のとおりキャッシュを設定しましたnginxの設定では1 秒あたり 500 件以上のリクエストが届くことがあり、すべてが正常であるように、そのトラフィックの多くをバックエンドから遠ざける必要があります。1 秒または 30 秒のキャッシュ (サイトのどの部分がキャッシュされるかによって異なります) を設定しましたが、これには、あるユーザーのページをキャッシュし、別のユーザーには間違ったページを提供するという残念な副作用があります。

これらのさまざまな状況を固有のものとして認識するようにキャッシュを調整するにはどうすればよいでしょうか? 以前は nginx とバックエンドの間に Varnish を設定していましたが、特別なことは何もしていませんでした。おそらく私たちのニーズに合うでしょうか?

答え1

以下は Cookie を使用した実装例です。Cookie 値がまたはのいずれかの場合dark、キャッシュされたページを提供しようとします。その他の Cookie 値 (値なしを含む) の場合、キャッシュをバイパスし、アップストリームが適切な Cookie を設定すると想定して、次のリクエストではキャッシュを使用します。lightmobile

proxy_cache_keyキャッシュ キーに Cookie 値を追加し、proxy_cache_bypassCookie が定義済み値のセットにない場合はキャッシュをスキップするために使用します。

map $cookie_theme $cache_bypass {
    default "1";
    "dark"      "0";
    "light"     "0";
    "mobile"    "0";
}

proxy_cache_path /var/tmp/nginx levels=1 keys_zone=test-cache:10m;

server {
    listen 80;
    server_name test-cache.localhost;

    location / {
        proxy_pass http://test-cache;

        proxy_cache test-cache;
        proxy_cache_valid 1m;
        proxy_cache_key "$host$request_uri $cookie_theme";
        proxy_cache_bypass $cache_bypass;
    }
}

マニュアル:

関連情報