web-dev-qa-db-ja.com

Varnishで静的ファイルをキャッシュする理由、渡さない理由

Nginx/php-fpm/varnish/wordpressおよびAmazon s3を実行しているシステムがあります。

今、私はシステムのセットアップ中に多くの設定ファイルを見てきました、そしてそれらのすべてで私はこのようなものを見つけました:

    /* If the request is for pictures, javascript, css, etc */
    if (req.url ~ "\.(jpg|jpeg|png|gif|css|js)$") {
        /* Remove the cookie and make the request static */
        unset req.http.cookie;
        return (lookup);
    }

なぜこれが行われるのか分かりません。ほとんどの例では、NginXをウェブサーバーとして実行しています。さて問題は、なぜこれらの静的ファイルをキャッシュするためにワニスキャッシュを使うのかということです。

Php-fpm/mysqlがそれほどヒットしないように、動的ファイルのみをキャッシュする方が私にはずっと理にかなっています。

私は正しいですか、ここで何か不足していますか?

更新

与えられた回答に基づいて質問に情報を追加したいと思います。

コンテンツが実際に大きく変化する動的なWebサイトがある場合、キャッシュは意味がありません。しかし、たとえば静的WebサイトにWordPress=を使用する場合、これは長期間キャッシュされる可能性があります。

そうは言っても、私にとってより重要なのはstatic conentです。さまざまなキャッシュアプ​​リとウェブサーバーアプリでいくつかのテストとベンチマークへのリンクを見つけました。

http://nbonvin.wordpress.com/2011/03/14/Apache-vs-nginx-vs-varnish-vs-gwan/

NginXは実際には静的コンテンツを取得するのが高速であるため、単に通過させるだけの方が理にかなっています。 NginXは静的ファイルでうまく機能します。

-

それとは別に、ほとんどの場合、静的コンテンツはWebサーバー自体にさえありません。ほとんどの場合、このコンテンツはCDNのどこかに、おそらくAWS S3に格納されています。ワニスキャッシュは、静的コンテンツを保存する最後の場所だと思います。

9
Saif Bechan

ワニスにはいくつかの利点があります。最初に注目するのは、バックエンドサーバーの負荷を減らすことです。通常、動的に生成されたがほとんど変更されない(アクセス頻度と比較して)コンテンツをキャッシュします。 Wordpressの例を使用すると、ほとんどのページはあまり頻繁に変更されない可能性が高く、ページが変更されたときにワニスキャッシュを無効にするプラグインがいくつかあります(新しい投稿、編集、コメントなど)。 。したがって、無期限にキャッシュし、変更時に無効にします。これにより、バックエンドサーバーへの負荷が最小になります。

リンクされた記事にもかかわらず、ほとんどの人は正しく設定されていればVarnishがNginxよりも優れたパフォーマンスを発揮することをお勧めします-(そして私は本当にそれを認めたくありません)-私のテストでは、nginxがvarnishよりも静的ファイルを提供できることに同意しているようです(幸いなことに、私はその目的でワニスを使用していません)。問題は、最終的にVarnishを使用する場合、セットアップにレイヤーを追加したことだと思います。その余分なレイヤーをバックエンドサーバーに渡すことは、バックエンドから直接サービスを提供するよりも常に遅くなります。これが、Varnishのキャッシュを高速化できる理由です-ステップを節約できます。他の利点は、disk-ioの前面にあります。ワニスをmallocを使用するように設定すると、ディスクにまったく影響を与えないため、他のプロセスで使用できるようになります(通常はスピードアップします)。

実際にパフォーマンスを測定するには、より良いベンチマークが必要だと思います。同じ単一ファイルを繰り返し要求すると、ファイルシステムキャッシュがトリガーされ、Webサーバー自体からフォーカスが移動し始めます。より優れたベンチマークでは、数千のランダムな静的ファイル(サーバーログからの場合もある)で包囲を使用して、現実的なトラフィックをシミュレートします。おそらく、あなたが述べたように、静的コンテンツをCDNにオフロードすることがますます一般的になっています。つまり、Varnishはおそらく最初からサービスを提供しないでしょう(S3について言及しています)。

実際のシナリオでは、メモリ使用量を優先する可能性があります-動的コンテンツが最初に生成されます。次に、小さな静的コンテンツ(例:js/css)、最後に画像-本当に正当な理由がない限り、他のメディアをメモリにキャッシュしないでしょう。この場合、Varnishがメモリからファイルをロードし、nginxがディスクからファイルをロードすると、varnishはnginxよりもパフォーマンスがよくなります(nginxのキャッシュはプロキシとfastCGI専用であり、デフォルトではそれらはディスクベースですが、 nginxをmemcachedで使用できます)。

(私のクイック-非常に大まかな、信頼性は与えられない-テストはnginx(直接)が最速であることを示した-それを100%と呼びましょうパスを使用した場合)が最も低速でした(約250%)。これは、すべてまたは何もないことです。バックエンドとの通信に余分な時間(および処理)を追加することで、ワニスを使用していて、RAM節約するには、nginxに戻す代わりに、可能な限りすべてをキャッシュしてVarnishから提供することもできます。)

10
cyberx86

何かが足りないのではないかと思います。

定義により、動的ファイルは変更されます。通常、これらは、ユーザーに提供されるページのコンテンツに影響を与える何らかのデータベースクエリを実行することによって変化します。したがって、動的コンテンツをキャッシュする必要はありません。そうした場合、それは単に静的コンテンツになり、おそらく誤ったコンテンツを含む静的コンテンツになります。

簡単な例として、ログインしているユーザーのユーザー名がページの上部にあるページがあるとします。そのページが読み込まれるたびに、データベースクエリが実行され、ページを要求しているログインユーザーに属するユーザー名が特定されます。これにより、適切な名前が表示されます。このページをキャッシュすると、データベースクエリは発生せず、すべてのユーザーがページの上部に同じユーザー名を表示し、ユーザー名ではない可能性があります。各ユーザーに適切なユーザー名が表示されるようにするには、ページの読み込みごとにこのクエリを実行する必要があります。したがって、キャッシュできません。

そのロジックをユーザー権限のようなもう少し問題のあるものに拡張すると、動的コンテンツがキャッシュされない理由がわかります。データベースが動的コンテンツにヒットしない場合、CMSは、ページを要求しているユーザーがそのページを表示する権限を持っているかどうかを判断する方法がありません。

静的コンテンツは、定義上、すべてのユーザーで同じです。したがって、ユーザーごとにそのページをカスタマイズするためにデータベースクエリを実行する必要はないので、それをキャッシュして不要なデータベースクエリを排除することは理にかなっています。画像は静的コンテンツの非常に優れた例です。すべてのユーザーに同じヘッダー画像、同じログインボタンなどを表示したいので、画像はキャッシュの優れた候補です。

上記のコードスニペットには、画像、CSS、JavaScriptを強制的にキャッシュする非常に典型的なVarnish VCLスニペットが表示されています。デフォルトでは、VarnishはCookieを含むリクエストをキャッシュしません。ロジックは、リクエストにCookieがある場合、サーバーがそのCookieを必要とする何らかの理由が必要であるため、バックエンドで必要であり、キャッシュを介して渡される必要があるという論理です。実際には、多くのCMS(Drupal、Wordpressなど)は、必要かどうかに関係なく、ほとんどすべてにCookieを添付するため、静的であることがわかっているコンテンツからCookieを取り除くためにVCLを記述して、ワニスをキャッシュするのが一般的です。それ。

理にかなっていますか?

2
jdw

動的コンテンツの場合、株価などの種類は実際に頻繁に変更されます(SaaS serverからbackend serverで毎秒更新されます)が、さらに頻繁に(数万のsubscription clientsで)照会される:

[stock calculation / backend server] ----- [SaaS server] ------ [subscription clients]

この場合、SaaS serverの__cachingは、backend serversからの1秒あたりの更新により、数十のクエリを満たすことができます。何千ものsubscription users

SaaSサーバーにキャッシュがないと、このモデルは機能しません。

2
Eli

Varnishを使用して静的ファイルをキャッシュすると、Nginxのオフロードの点でメリットがあります。もちろん、キャッシュする静的ファイルがたくさんある場合は、RAMを浪費します。ただし、Varnishには素晴らしい機能があり、キャッシュ用に複数のストレージバックエンドをサポートしています。

静的ファイルの場合:HDDへのキャッシュ他のすべての場合:RAMへのキャッシュ。

これにより、このシナリオを実装する方法についてより多くの洞察が得られます。 http://www.getpagespeed.com/server-setup/varnish-static-files-cache

1