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


9

私は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を使用している場合、これは長期間キャッシュされる可能性があります。

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

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

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

-

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

回答:


10

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

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

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

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

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


私はあなたが言った点が好きです、私はこれを掘り始めたばかりです、そしてほとんどのオンラインガイドがワニスで静的コンテンツをキャッシュできるようにするのは奇妙だと思います、何人かの人々はMBの静的コンテンツをキャッシュしているに違いありません。あなたが言うこと本当であるならば、それは小さなファイルです、とあれば、あなたは余裕のメモリを持っている、それはOKです。
Saif Bechan 2011

とは言っても、私には余裕のあるメモリがなく、CDNに配置したくないテンプレートレイアウトファイルがいくつかあります。テンプレートディレクトリに配置したいだけです。私はそれらをキャッシュするワニス設定からスニペットを削除するので、私が持っているメモリをよりよく使用することができます。3つの異なるセットアップに関するヒントが気に入りました。私はnginxへのポートを直接開いて、そこからテンプレートファイルを提供するだけだと思います。ニスハンドルhtml、nginxハンドルスタティック、および必要に応じてphp / mysqlで新しいコンテンツを処理します。
Saif Bechan 2011

多くのVarishセットアップは多くのGBのメモリを使用することに注意してください-適切にセットアップされており、実際のシナリオでは、nginxよりもパフォーマンスが優れていることは間違いありません。でも、ヴァニッシュが提供する柔軟性とオプションが人気を呼んでいると思うかもしれません-結局のところ、キャッシング用に特別に設計されています。Wordpressの場合、私の推奨設定はWordpress + W3TC(+ Cloudfront)+ Varnish + Nginx + PHP-FPM + APCです。実際には他のセットアップほど高速ではない場合もありますが、負荷を非常によく処理し、優れたパフォーマンスを発揮します。多くの場合、企業のファイアウォールは非標準ポートをブロックすることに注意してください。
cyberx86 2011

好奇心から、テンプレート(おそらくCSS / JS-PHPはもちろん、サーバーに常駐している必要があります)をCDNに保持しませんか?また、私のec2-instancesの1つは同じ前提を念頭に置いてセットアップされており、以下が含まれています:if (req.url ~ "\.(png|gif|jp(e?)g|avi|flv|mp(e?)g|mp4|mp3)"){return(pass);}vcl_recv()。基本的に、私はメディアをキャッシュしたくない-しかし、html(php)とjs / cssさえキャッシュしたい(理論的には、レイアウトが行うよりも画像がページの読み込み時間に与える影響が少ないという理論)。
cyberx86

私はw3tcを見てきましたが、プラグインを使用したくありません。特定のサイトごとに特定のオプションを処理する独自の小さなプラグインを作成するだけなので、すべての機能がわかります。プログラマーの視点から、私はいくつかのプラグインを見てきました、そしていくつかは恐ろしいように設計されています。私は自分のminifyプラグインを作成し、直接スマッシュしてメディアファイルをs3とcfにアップロードし、小さなmemcachedプラグインなどを作成しました。テンプレートをCDNにアップロードするための最終的なプラグインを作成するポイントに達していません。
Saif Bechan

2

何かが足りないかもしれません。

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

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

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

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

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

理にかなっていますか?


回答ありがとうございます。一部のウェブサイトでは動的コンテンツが変更されるが、私のような他のサイトでは頻繁に変更されないという事実を知っています。私はCMSを使用して、生活をシンプルにしています。そのため、動的ページを1週間キャッシュできます。重要、動的については忘れましょう。nginxをバックエンドとして使用している場合に静的コンテンツをキャッシュする理由がわかりません。私が正しい場合、nginxとニスは静的コンテンツと同じくらい高速であるか、間違っています。静的ルックアップは、ワニスの場合と同じようにnginxと同じくらい速く処理できます。質問を少し更新しました。
Saif Bechan 2011

2

以下のための動的コンテンツ、株価情報は実際に頻繁に変更するようないくつかの種類には、(上の各秒を更新SaaS serverからbackend server)が、(数万で、より頻繁に照会される可能性がありますsubscription clients):

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

この場合には、キャッシュSaaS serverから毎秒更新backend servers十万ののクエリを満足することができますsubscription users

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


1

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

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

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


静的ファイルをHDDキャッシュに置くことができる理由に興味があります。これは、本質的に、キャッシュなしでディスクからファイルを提供することと同じではありませんか?
シェーンN

基本的に、はい:)しかし、Varnishが配置されている場合、それらを取得するためにバックエンド(Nginx、Apacheなど)に接続する必要があります。ファイルシステムから直接行うことはできません。バックエンド通信のオーバーヘッドをなくすために、ディスクにもキャッシュされます。
Danila Vershinin 2016年

ああ、それは理にかなっている-@ danila-vに感謝
シェーンN
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.