17

まず、ワニスについて完全に理解していないことをお許しください。ワニスを使って何かをするのはこれが初めてです。

私は次の例に従っています:http ://www.kalenyuk.com.ua/magento-performance-optimization-with-varnish-cache-47.html

ただし、これをインストールして実行すると、Varnishがキャッシュされないようです。単一の番号を持つX-Varnishヘッダーと、1.1varnishの値を持つ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を構成する方法について誰かが私に手がかりを与えることができるかどうか疑問に思いました。

4

7 に答える 7

9

http://moprea.ro/2011/may/6/magento-performance-optimization-varnish-cache-3/は、ニスでフルページキャッシュを有効にするMagento拡張機能について説明しています。この拡張機能は、githubで公開されているVarnish構成に依存しています。

これらはすでに実装されている機能です。

  1. 実行可能なワニス構成
  2. 超高速キャッシングHTTPリバースプロキシであるVarnishを使用してフルページキャッシングを有効にします。
  3. ワニスサーバーは、管理者の[システム]/[構成]/[一般]-[ワニスオプション]で構成できます。
  4. 製品、カテゴリ、およびCMSページが保存されるときに、キャッシュされたページのみを自動的にクリアします。
  5. MagentoAdminの[システム]/[キャッシュ管理]に新しいキャッシュタイプを追加し、キャッシュを非アクティブ化して更新する可能性を提供します。
  6. カテゴリナビゲーションが保存され、すべてのページのメニューが更新されるようにVarnishキャッシュを更新する必要がある場合に、管理者ユーザーに通知します。
  7. カートに商品が入っている、またはログインしているユーザーなどの場合、ニスキャッシュを自動的にオフにします。
  8. モジュールが機能するように提供されるデフォルトのニス構成。スクリーンショット:https ://github.com/madalinoprea/magneto-varnish/wiki
于 2011-05-25T08:00:02.167 に答える
7

VarnishでMagentoをキャッシュする方法(理論)-これには2つのコンポーネントがあります

1)静的アセット(画像、CSS、JSなど)-これは、このカテゴリに属する​​リクエストを検出し、キャッシュ時間を設定する(またはオリジンサーバーから送信されるキャッシュ時間に依存する)単純な一般的なパターンです 。これは要点の形で

2)HTMLドキュメント-これは、優れたMagentoソリューションのはるかに複雑な部分です。Magentoのパフォーマンスを向上させるには、HTMLドキュメントをVarnishにキャッシュすることが重要です。HTMLドキュメントの生成は、Magentoサーバーが実行する最も高価な(時間のかかる)処理です。

HTMLドキュメントのキャッシュに関する課題は、パーソナライズされたコンテンツにあります。

パーソナライズされたコンテンツとHTMLドキュメント

Magentoおよび他のすべてのeコマースサイトは、セッションを通じて特定のユーザーの状態を管理します。セッションは、サイトでのその特定のユーザーのステータスの記録です。これには、次のようなものが含まれます。「HelloBob」-ページの上部にある「4ThingsinYourCart」-各ページのショッピングカートのステータス

これらはユーザー間で共有できないアイテムであり、これが発生した場合に大きな問題を引き起こす可能性があります(これを「セッションリーク」と呼びます)。

HTMLページにその人が誰であるかおよびショッピングカートに何が入っているかに関する個人情報が含まれている場合、HTMLページをどのようにキャッシュしますか?

これを実現するには、主に2つの方法があります。ページの読み込み後に追加のリクエストを介してページのパーソナライズされた要素を読み込むここでの一般的な実装方法は、AJAXを使用して、パーソナライズされたページ要素をリクエストすることです。キャッシュ可能およびその他のキャッシュ不可(またはユーザー間で共有不可)。Varnishは、HTMLドキュメントのさまざまな部分をさまざまにキャッシュできるESI(Edge Side Includes)と呼ばれるテクノロジーをサポートしています。

ワニスの実装戦略では、ユーザーのパーソナライズを考慮に入れる必要があります。

ワニスの実装オプション

Magento 1.X-Magentoバージョン1でHTMLドキュメントをキャッシュするために最も広く使用されている方法は、Magento Turpentine(Nexus製)と呼ばれるオープンソース製品です。これは(Magento Connectを介して)インストールされるプラグインであり、VarnishがこれらのリソースをキャッシュできるようにHTMLドキュメントにESIタグを自動的に追加します。MagentoTurpentineインストール/ガイド

Magento 2.X-最新バージョンのMagento(現在ベータ版)は、本番環境でのHTMLキャッシングの推奨ソリューションとしてVarnishをサポートしています。これは素晴らしいニュースです。VarnishはMagentoの推奨オプションであり、すぐに使用してサイトの速度を向上させることができます。

ワニスとMagentoをうまく機能させる方法

展開は1つのことです。VarnishMagentoソリューションを実装して機能させた後の次のステップは、そのパフォーマンスを理解することです。さまざまな追加インフラストラクチャの展開(または1回限りの手動ログ収集の実行に行き詰まっている)を伴うため、要求ごとにキャッシュヒット率と詳細ログのメトリックを取得することは困難な場合があります。

最近、クラウドでサービスとしてVarnishを実行するためにこのインフラストラクチャを構築しました(完全なログ/メトリックを使用)-www.section.io-これは、必要に応じてVarnishおよびMagentoプロジェクトを実際に成功させるための最も重要な要素になる可能性があります実装を絶えず調整して、URL内のさまざまなクエリ文字列(Hello google analytics "gclid"!)などを管理し、キャッシュヒット率を大幅に削減できます。

于 2015-08-07T06:08:10.067 に答える
4

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);
# }
于 2013-01-10T23:37:41.160 に答える
3

これは、Magentoがすべてのユーザーに送信するセッションCookieだと思います。Varnish+Redmineでも同様の問題が発生しました。

Varnishがページをキャッシュしない理由は、デフォルトでは安全であると確信できるものだけをキャッシュするためです。Cookieを使用するユーザーは通常、特定のページの読み込みに対して異なるものを表示します。たとえば、ログインしている場合、ユーザー名は次のようになります。各ページの上部にあるため、ページをキャッシュできません†。

ただし、多くのフレームワークは、ログインしていないユーザーにもセッションCookieを提供します。Magentoをまったく知らないので、このCookieを無視した場合の結果を予測することはできません-Redmineでは、Cookieを無視すると、ユーザーはログインできなくなり、すべてのフォームが機能しなくなりました(CSRFがなくなったため)トークン)。

可能であれば、Magento側からこれに取り組む方がおそらく良いでしょう-Varnishはアップストリームのヘッダーをリッスンして、何をキャッシュできるかなどを判断します。

できない場合は、Varnishの構成から軽減できる可能性があります。Set-Cookieヘッダーがキャッシュヒットから送信されないようにする必要があります。また、Cookieが効果を持たないページのリクエストでは、クライアントのCookieをドロップする必要があります。これは、ログイン画面やログインが必要なページなどの例外が必要になることを意味します(ログイン後にMagentoが別のCookieを設定しない限り、これにより作業がはるかに簡単になります)。

Varnishのドキュメント(リソースとして強くお勧めします)には、ヒット率の増加に関するいくつかのページがあります。これには、特に一部のページにCookieをドロップし、他のページにはドロップしないページが含まれます。

†例外があります。これは、エッジサイドインクルードを使用している場合です。

于 2011-05-20T08:25:02.087 に答える
0

十分にテストされたVarnish構成ファイル(VCL)と、MagentoバックエンドからVarnishのリグネスを制御するための豊富なオプションを備えた緊密に統合されたMagentoモジュールを提供することにより、MagentoとVarnishがスムーズに連携できるようにするVarnishを搭載したPageCacheというモジュールを開発しました。MagentoConnectで確認してください。

http://www.magentocommerce.com/magento-connect/Phoenix/extension/6322/varnish_cache

于 2011-05-13T21:42:54.417 に答える
0

これは、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オープンソースフルページキャッシュ

于 2012-10-28T09:40:57.843 に答える
-1

http://moprea.ro/2011/feb/16/magento-performance-optimization-varnish-cache-2/

それが役立つかどうかはわかりませんが、私はこれを偶然見つけました。

私は実際に以前にニスを機能させることを試みましたが、失敗しました。ワニスを試す前に、APC + Memcached+tmpfsセッション/キャッシュを取得することをお勧めします。

于 2011-02-20T12:45:40.990 に答える