2011-01-05 5 views
11

私は、RailsスタックによってレンダリングされるWebアプリケーションの全ページ(数千ページ)をキャッシュしたいが、頻繁には変更しない。各レンダリングは、リソースに関してかなり高価です。VarnishdはRailsで使用する適切なキャッシュソリューションですか?

Varnishdの仕組みを理解しておくと、URLを最初に呼び出したときに、Varnishdがキャッシュストアをチェックしてミスが発生するため、要求がRailsに渡され、生成されるページが生成されますVarnishdキャッシュに追加されます。

その後、そのURLに対して呼び出しが行われた後、Varnishdキャッシュから提供された場合、Railsスタックは関与しません。

これは正しいのですか?

キャッシュストアに加えられた変更を反映するために、特定のページが更新されたときにアプリがVarnishdに伝える方法を教えてください。&

この目的にはVarnishdが適していますか?

あなたの助けてくれてありがとう - 私はこれらは非常に基本的な質問であることを知っていますが、ドキュメントはこれを明確にしていません(少なくとも私に)。 http://www.mnot.net/cache_docs/

あなたはHTTPレスポンスに有効期限時間を指定する必要がありますキャッシングとリバースプロキシを使用するには:

答えて

3

は、私はマーク・ノッティンガムでHTTPキャッシュにこのガイドを読んでお勧めします。新しいコンテンツが利用可能になったらキャッシングサーバーに伝えることは一般的に不可能です。なぜなら、プロトコルはインターネット上で統合されるためであり、新しいキット写真があるときは世界中のサーバーに伝える必要はないからです。 )

Railsのページキャッシュはまったく同じではありません。これは、ファイルを静的に処理するためにWebサーバーに負荷をかけますが、決定にhttpプロトコルを使用しません。

警告:私は、ワニスを個人的に試していないことを指摘しておきます。この回答は、ワニスがhttpキャッシングのリバースプロキシであるという(私は正しいと思う)前提に基づいています。

+1

正しいですが、VarnishはHTTPキャッシュ付きHTTPリバースプロキシであり、HTTPキャッシュ用に最適化されています。あなたがHerokuを試したなら、あなたはVarnishを試みました。 – yfeldblum

+1

ほとんどのリバースプロキシは、実際には新しいコンテンツが利用可能であることをキャッシュに伝える方法を持っていますが、フラッシュするサーバーを知り、それらを通知する方法を構成する必要があります。 Varnishには、アプリケーションから、または手動で接続できる管理インタフェース(制御チャネル)があります。したがって、フラッシュするサーバーが分かっていれば、それを行うのは簡単です。 –

1

noodlの回答に記載されているように、リバースプロキシを使用している場合は、通常、ページの有効期限が制御から外れます。代わりの方法として、レールをpage caching(セクション1.1を参照)とすることが有効期限を管理する必要があります。これにより、最初にアクションが呼び出されたときにレールがディスクへの応答を公開ディレクトリにレンダリングされ、それらのhtmlファイルを直接提供することができます。私はこれのためにnginxを使い、存在する静的ファイル(通常は画像ですが、html拡張子を扱う正しい書き換えでもhtmlページにも機能します)を提供する指示を持っています。キャッシュでレールを管理すると、ガイドページの例のように、新しいアイテムが作成されたときにインデックスが期限切れになるなど、期限切れになることがあります。

リバースHTTPプロキシは、キャッシュがコントロール外のネットワークの部分に伝播できるようにするために、非常に高いスループットを持つことを目的としていますが、レールのページキャッシュが良い選択肢になるかもしれません。

+0

実際、TTLを打つ前にキャッシュの無効化をサポートしていない専用のリバースプロキシを見つけることは、まれです。これは重要なユースケースのようなものです。通常、標準のHTTPキャッシングヘッダーを使用して行われません。 –

+0

ああ、よく知っておきたいことですが、私はちょうどそれをする方法を言及する新しい答えがあることがわかります。 – Jeremy

5

ダイナミックキャッシュの無効化を行うには、アプリケーションサーバーから管理チャネル経由でpurge.url {some regexp}を送信します。たとえば、purge.url "^/some/page/$"です。しかし、RailsではおそらくPURGE HTTPメソッドを使うのが一番簡単です。だからではなく、HTTP GETを行うので、あなたが同じURIに対してPURGEにしてください:

PURGE /some/page/ HTTP/1.0 
Host: example.com 

この要求は、設定でこれを上書きしない限りlocalhostから来ています。

いくつかのリンク:

1

ページのキャッシュは、おそらく何をしたいです。ワニスよりもセットアップとメンテナンスが簡単になるでしょう。リバースプロキシを使用したキャッシュには、各アプリケーションサーバーではなく単一の場所でキャッシュを無効にできるため、複数のアプリケーションサーバーに拡張を開始するときにいくつかの利点があります。

ページが変更されたときにRailsがVarnishに伝えるHTTP PURGEリクエストに応答するように、Varnishを設定できます。これらの行に沿ってpluginarticleがあります。

+1

単純なキャッシングが必要な場合は、はい。あなたのキャッシングシステムで遠隔操作することが必要な場合でも、Railsのページキャッシュは不十分である可能性があります。 Varnishは、ほとんどの人がRailsのページキャッシュを超えたところに本当に輝いています。 –

関連する問題