まず、ワニスを完全に理解していないことをお許しください。ワニスで何かをするのはこれが初めてです。
私は次の例に従っています: http://www.kalenyuk.com.ua/magento-performance-optimization-with-varnish-cache-47.html
ただし、これをインストールして実行すると、Varnishがキャッシュされないようです。単一の番号を持つX-Varnishヘッダーと、1.1ワニスの値を持つViaヘッダーを取得します
私は(私のISPから)Magentoが設定する次のCookieが原因であると言われました:
Set-Cookie: frontend=6t2d2q73rv9s1kddu8ehh8hvl6; expires=Thu, 17-Feb-2011 14:29:19 GMT; path=/; domain=XX.X.XX.XX; httponly
彼らは、これを処理するためにMagentoを変更するか、これを処理するようにVarnishを構成する必要があると言いました。 Magentoを変更することは問題外なので、このCookieを処理するようにVarnishを構成する方法について誰かが私に手がかりを与えることができるかどうか疑問に思いました。
http://moprea.ro/2011/may/6/magento-performance-optimization-varnish-cache-3/ は、ニスでフルページキャッシュを有効にするMagento拡張機能について説明しています。この拡張機能は、githubで公開されているVarnish構成に依存しています。
これらはすでに実装されている機能です。
1)静的アセット(画像、CSS、JSなど)-これは、このカテゴリに属するリクエストを検出し、キャッシュ時間を設定する(またはオリジンサーバーから送信されるキャッシュ時間に依存する)ことを含む単純な一般的なパターンです- 要点形式の例
2)HTMLドキュメント-これは、優れたMagentoソリューションのはるかに複雑な部分です。 Magentoのパフォーマンスを向上させるには、HTMLドキュメントをVarnishにキャッシュすることが重要です。 HTMLドキュメントの生成は、Magentoサーバーが実行する最も費用のかかる(時間のかかる)作業です。
HTMLドキュメントのキャッシュに関する課題は、パーソナライズされたコンテンツにあります。
Magentoおよび他のすべてのeコマースサイトは、セッションを通じて特定のユーザーの状態を管理します。セッションは、サイトでのその特定のユーザーのステータスの記録です。これには、次のようなものが含まれます。「HelloBob」-ページの上部にある「4Things inYourCart」-各ページのショッピングカートのステータス
これらはユーザー間で共有できない項目であり、これが発生した場合に大きな問題を引き起こす可能性があります(これを「セッションリーク」と呼びます)。
HTMLページに、その人が誰で、ショッピングカートに何が入っているかに関する個人情報が含まれている場合、どのようにHTMLページをキャッシュしますか?
これを実現するには、主に2つの方法があります。ページの読み込み後に追加のリクエストを介してページのパーソナライズされた要素を読み込むここでの一般的な実装方法は、AJAXを使用して、パーソナライズされたページ要素をリクエストすることです。 HTMLドキュメントのコンポーネントをキャッシュ可能および他のキャッシュ不可(またはユーザー間で共有不可)としてマークするテクノロジー。Varnishは、HTMLドキュメントのさまざまな部分を可能にするESI(Edge Side Includes)と呼ばれるテクノロジーをサポートします。別の方法でキャッシュされます。
ワニスの実装戦略では、ユーザーのパーソナライズを考慮に入れる必要があります。
Magento 1.X-Magentoバージョン1でHTMLドキュメントをキャッシュするために最も広く使用されている方法は、Magento Turpentine(Nexus製)と呼ばれるオープンソース製品です。これは(Magento Connectを介して)インストールされるプラグインであり、VarnishがこれらのリソースをキャッシュできるようにESIタグをHTMLドキュメントに自動的に追加します。 Magento Turpentineインストール/ガイド ==
Magento 2.X-最新バージョンのMagento(現在ベータ版)は、本番環境でのHTMLキャッシングの推奨ソリューションとしてVarnishをサポートしています。これは素晴らしいニュースです。VarnishはMagentoの推奨オプションであり、すぐに使用してサイトの速度を向上させることができます。
展開は1つのことです。VarnishMagentoソリューションを実装して機能させたら、次のステップはそのパフォーマンスを理解することです。さまざまな追加インフラストラクチャを展開する(または1回限りの手動ログ収集を行うのに行き詰まる)ため、要求ごとにキャッシュヒット率と詳細ログのメトリックを取得することは困難な場合があります。
最近、Varnishをクラウドでサービスとして実行するためにこのインフラストラクチャを構築しました(完全なログ/メトリックを使用)- www.section.io -これは、実際に成功するための最も重要な要素です。ワニスとMagentoのプロジェクトでは、URL内のさまざまなクエリ文字列(Hello google analytics "gclid"!)などを管理するために実装を絶えず調整する必要があるため、キャッシュのヒット率を大幅に減らすことができます。
Varnish 3.0を使用している場合は、.vcl構成を変更する必要がある場合があります。これが私がmagentoとニス3で使用しているものです:
# This is a basic VCL configuration file for varnish. See the vcl(7)
# man page for details on VCL syntax and semantics.
#
# Default backend definition. Set this to point to your content
# server.
#
backend default {
.Host = "127.0.0.1";
.port = "8080";
}
acl trusted {
"127.0.0.1";
"127.0.1.1";
# Add other ips that are allowed to purge cache
}
#
# http://www.varnish-cache.org/docs/2.1/tutorial/vcl.html#vcl-recv
# @param req Request object
sub vcl_recv {
if (req.http.x-forwarded-for) {
set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip;
}
else {
set req.http.X-Forwarded-For = client.ip;
}
if (req.request == "PURGE") {
# Allow requests from trusted IPs to purge the cache
if (!client.ip ~ trusted) {
error 405 "Not allowed.";
}
ban("req.url ~ " + req.url);
error 200 "Ok"; #We don't go to backend
#return(lookup); # @see vcl_hit
}
if (req.request != "GET" &&
req.request != "HEAD" &&
req.request != "PUT" &&
req.request != "POST" &&
req.request != "TRACE" &&
req.request != "OPTIONS" &&
req.request != "DELETE") {
/* Non-RFC2616 or CONNECT which is weird. */
return (pipe);
}
# Cache only GET or HEAD requests
if (req.request != "GET" && req.request != "HEAD") {
/* We only deal with GET and HEAD by default */
return (pass);
}
# parse accept encoding rulesets to normalize
if (req.http.Accept-Encoding) {
if (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip";
} elsif (req.http.Accept-Encoding ~ "deflate") {
set req.http.Accept-Encoding = "deflate";
} else {
# unkown algorithm
remove req.http.Accept-Encoding;
}
}
# Rules for static files
if (req.url ~ "\.(jpeg|jpg|png|gif|ico|swf|js|css|gz|rar|txt|bzip|pdf)(\?.*|)$") {
set req.http.staticmarker = "1";
unset req.http.Cookie;
return (lookup);
}
# Don't cache pages for Magento Admin
# FIXME: change this rule if you use custom url in admin
if (req.url ~ "^/(index.php/)?admin") {
return(pass);
}
# Don't cache checkout/customer pages, product compare
# if (req.url ~ "^/(index.php/)?(checkout|customer|catalog/product_compare|wishlist)") {
# return(pass);
# }
# Don't cache checkout/customer pages, product compare
if (req.url ~ "/(checkout|customer|catalog/product_compare|wishlist)/") {
return(pass);
}
# Don't cache till session end
if (req.http.cookie ~ "nocache_stable") {
return(pass);
}
# Unique identifier witch tell Varnish use cache or not
if (req.http.cookie ~ "nocache") {
return(pass);
}
# Remove cookie
unset req.http.Cookie;
set req.http.magicmarker = "1"; #Instruct varnish to remove cache headers received from backend
return(lookup);
}
sub vcl_pipe {
# # Note that only the first request to the backend will have
# # X-Forwarded-For set. If you use X-Forwarded-For and want to
# # have it set for all requests, make sure to have:
# # set req.http.connection = "close";
# # here. It is not set by default as it might break some broken web
# # applications, like IIS with NTLM authentication.
return (pipe);
}
#sub vcl_pass {
# return (pass);
#}
#sub vcl_hash {
# set req.hash += req.url;
# if (req.http.Host) {
# set req.hash += req.http.Host;
# } else {
# set req.hash += server.ip;
# }
# return (hash);
# }
# Called after a cache lookup if the req. document was found in the cache.
sub vcl_hit {
if (req.request == "PURGE") {
ban_url(req.url);
error 200 "Purged";
}
#
# ATTENTION!! I had to comment this to make it work on vernish 3.0!!!!
# error message:
# Symbol not found: 'obj.cacheable' (expected type BOOL):
#
# I'm not sure about it, please check!!!
#
#if (!obj.cacheable) {
# return (pass);
#}
return (deliver);
}
# Called after a cache lookup and odc was not found in cache.
sub vcl_miss {
if (req.request == "PURGE"){
error 200 "Not in cache";
}
return (fetch);
}
# Called after document was retreived from backend
# @var req Request object.
# @var beresp Backend response (contains HTTP headers from backend)
sub vcl_fetch {
set req.grace = 30s;
# Current response should not be cached
if(beresp.http.Set-Cookie ~ "nocache=1") {
return (deliver);
}
# Flag set when we want to delete cache headers received from backend
if (req.http.magicmarker){
unset beresp.http.magicmarker;
unset beresp.http.Cache-Control;
unset beresp.http.Expires;
unset beresp.http.Pragma;
unset beresp.http.Cache;
unset beresp.http.Server;
unset beresp.http.Set-Cookie;
unset beresp.http.Age;
# default ttl for pages
set beresp.ttl = 1d;
}
if (req.http.staticmarker) {
set beresp.ttl = 30d; # static file cache expires in 30 days
unset beresp.http.staticmarker;
unset beresp.http.ETag; # Removes Etag in case we have multiple frontends
}
return (deliver);
}
# Called after a cached document is delivered to the client.
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT ("+obj.hits+")";
} else {
set resp.http.X-Cache = "MISS";
# set resp.http.X-Cache-Hash = obj.http.hash;
}
return (deliver);
}
#
# sub vcl_error {
# set obj.http.Content-Type = "text/html; charset=utf-8";
# synthetic {"
# <?xml version="1.0" encoding="utf-8"?>
# <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
# "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
# <html>
# <head>
# <title>"} obj.status " " obj.response {"</title>
# </head>
# <body>
# <h1>Error "} obj.status " " obj.response {"</h1>
# <p>"} obj.response {"</p>
# <h3>Guru Meditation:</h3>
# <p>XID: "} req.xid {"</p>
# <hr>
# <address>
# <a href="http://www.varnish-cache.org/">Varnish cache server</a>
# </address>
# </body>
# </html>
# "};
# return (deliver);
# }
これはMagentoがすべてのユーザーに送信するセッションCookieだと思います。Varnish+ Redmineでも同様の問題が発生しました。
Varnishがページをキャッシュしない理由は、デフォルトでは安全であることが確実なものだけをキャッシュするためです。Cookieを使用するユーザーは通常、特定のページの読み込みに対して異なるものを表示します。たとえば、ログインしている場合、ユーザー名は次のようになります。各ページの上部にあるため、ページをキャッシュできません†。
ただし、多くのフレームワークは、ログインしていないユーザーにもセッションCookieを提供します。 Magentoをまったく知らないので、このCookieを無視した場合の結果を予測することはできません-Redmineでは、Cookieを無視すると、ユーザーはログインできなくなり、すべてのフォームが機能しなくなりました(CSRFがなくなったため)トークン)。
可能であれば、Magento側からこれに取り組む方がおそらく良いでしょう-Varnishはアップストリームのヘッダーをリッスンして、何をキャッシュできるかなどを決定します。
それができない場合は、Varnishの構成からそれを軽減できる可能性があります。 Set-Cookieヘッダーがキャッシュヒットから送信されないようにする必要があります。また、クライアントのCookieが効果のないページのリクエストでは、そのCookieを削除する必要があります。つまり、ログイン画面や、ログインが必要なページなどの例外が必要になります(ただし、ログイン後にMagentoが別のCookieを設定すると、作業がはるかに簡単になります)。
ワニスのドキュメント(リソースとして強くお勧めします)には、ヒット率の増加に関するいくつかのページがあります。その中には、特に 一部のページにCookieをドロップし、他のページにはドロップしない に関するものも含まれます。
†例外があります。これは、 エッジ側に含まれる を使用している場合です。
十分にテストされたVarnish構成ファイル(VCL)と、MagentoバックエンドからVarnishのリグネスを制御するための豊富なオプションを備えた緊密に統合されたMagentoモジュールを提供することにより、MagentoとVarnishがスムーズに連携できるようにするVarnishを搭載したPageCacheというモジュールを開発しました。 MagentoConnectで確認してください。
http://www.magentocommerce.com/magento-connect/Phoenix/extension/6322/varnish_cache
これは、Magentoでニスを使用しない方法を説明していると思います
Aoe_staticモジュールとニス3用のカスタムvclを使用すると、キャッシュされたページ応答のCookieがクリアされます。これはvclフェッチで実行する必要があります。その後、動的コンテンツをロードする小さなajax応答からCookieを設定できます。これにより、セッションやカートなどが維持されます。このajax応答は、vclリカバリで「パイプ」することができます。
私はこれを行うのに問題はありませんが、実稼働サイトで試したことはありません。
動的ブロックは、layoutxmlを介してプレースホルダーに置き換える必要があります。これらの置き換えが気に入った場合は、ニスエッジサイドインクルードまたはカスタムajax実装である可能性があります。
Aoe_static(または任意のタイプのajaxメソッド)から動的コンテンツをロードするときは、Magentosレイアウトシステムを引き続き使用できることを覚えておくとよいでしょう。ネストされたブロックをレンダリングするajax呼び出しのハンドルを作成します。
Aoe_staticモジュールを使用すると、loadLayoutが呼び出されますが、そのloadLayoutに渡されるハンドルを覚えておいてください。これは、あなたがいるページのレイアウト要求と同じではありませんが、デフォルトのハンドルを取得します。
もう1つの問題は在庫レベルです。カートに追加するのに十分な在庫が製品にない場合でも、製品リストに表示され、構成可能でグループ化された製品のオプションとして表示されます。
おそらく、オブザーバー(cataloginventory_stock_item_save_after)を使用して在庫レベルを確認できます(私はこれを確認していません)。次に、製品のURLに基づいてキャッシュを削除できます。商品が表示されるカテゴリのURLを取得し、同時にそれらを削除するのは非常に簡単です。
フェニックスモジュールには、オブザーバーからの簡単な実装を確認したい場合に、これらの種類のパージを実行するメソッドがあります。
しかし、階層化されたナビゲーションURLを処理する方法はもっと注意が必要です。事前にベースカテゴリリストのURLをキーとして使用してアプリが提供したクエリ文字列パラメーターを保存し、オブザーバーでこれらのURLを読み取ってパージする必要があります。クエリ文字列パラメータのこの保存は、送信前の応答を使用して、正規表現でリクエストオブジェクトをチェックし、カンマ区切りで使用されるクエリ文字列をログに記録することで十分に簡単です。
現在のモジュールのどれもレイヤードナビゲーションの在庫レベルを扱っていないと考えるのは間違っていますか?
オープンソースコミュニティでは、他のすべてのモジュールが不足しているため、ニス用の完成度の高いモジュールが必要だと思います。個人的には、負荷分散されたサーバーで有料のフルページキャッシュのみを使用し、画像とcssのリクエストをキャッチするためにワニスを使用する予定です。誰かが力を合わせて適切なワニスの実装を作成したい場合を除き、またはこれらすべての懸念に対処するオープンソースの実装に作業を追加できれば、サイトの問題を喜んでサポートします。
この質問に直面する問題の詳細については、この質問をチェックアウトしてください- magentoオープンソースフルページキャッシュ