0

私は一般的にワニスとキャッシングの初心者なので、この質問は些細なことかもしれません。

私は (Rails で) Web アプリを構築しており、実稼働サーバーにコンテンツをキャッシュするためのいくつかのオプションを検討していました。私はこれまで Varnish を見てきましたが、Cookie を使用したリクエストがキャッシュされないことについて少し心配しています。このような動作が意図されている理由は理解できますが、Cookie を介してコンテンツをキャッシュする方法があれば、本当に役立つユース ケースが 1 つあります。

私の特定のケースでは、ログインしているユーザーに関係なく、多くの URL に同じデータがあります。たとえば、tripadvisor は、ログインしているすべてのユーザーに、ホテルのリストについて同じデータ (少なくともデータの大部分) を返す可能性があります。したがって、基本的には、リクエスト/レスポンスには Cookie が伴いますが、ページの約 90% は各ユーザーに共通です。

そのようなシナリオでは、Varnish を使用してそのような URL/ページをキャッシュすることは可能ですか (おそらく共通部分のみ)。はいの場合、どのように。

ありがとうございます!

4

2 に答える 2

2

あなたのユースケースを正しく理解していれば。Cookie が存在する場合でも、ページのサブセットをキャッシュする必要があります。これらのページはすべてのユーザーにとって同じであるためです。

これを行う最善の方法は、常にキャッシュしたいページを特定することです。たとえば、/foo.html と /bar.html としましょう。これらのページでは、VCL で Cookie リクエスト ヘッダーを削除して、Varnish がページをキャッシュできるようにすることができます。

次の VCL コードを例として使用できます。

sub vcl_fetch {
    [...]
    if(req.url ~ "/foo.html" || req.url ~ "/bar.html") {
        unset req.http.Cookie
    }

    [...]
    if (req.http.Authorization || req.http.Cookie) {
        /* Not cacheable by default */
        return (pass);
    }
}

さらに多くのページがある場合は、if条件に正規表現を使用してページ名を一致させることができます。

ページの一部のみをキャッシュしたい場合は、Varnish でサポートされているため (サポートは限定的ですが十分です)、ESI を使用できますがこれにはアプリケーションの一部を書き直す必要があり、ESI を使用する IMHO は実際には PITA です。実行します(メンテナンスが難しくなります)。

于 2012-02-09T06:52:26.893 に答える
0

デフォルトの Varnish vcl は Cookie を使用してリクエストを「渡します」が、デフォルトの vcl の使用は、Varnish サーバーが稼働中であることをテストする場合にのみ有効です。デフォルトの vcl が、変更を加えることなく期待どおりに機能することはほとんどありません。

必ずしも Cookie を削除する必要はありません。vcl_recv() 内から Cookie を使用してリクエストを処理する方法を変更する方が簡単です。vcl_hash() は、デフォルトでは Cookie をハッシュ化しません。

さらに vcl_fetch() は Varnish 4 には存在しません。

于 2016-04-28T15:04:28.683 に答える