2011-11-22 5 views
4

私は昨日私のサーバーに大きな負荷をかけていました。前回のパフォーマンスの最適化に取り組んでいても(2ヶ月ほど前に同様の問題がありました)、サーバーが負荷を処理できませんでした1分あたり約50件のアカウント作成)。Varnishでsymfony 1.4を使用するにはどうすればよいですか?

最後に、インスタンスを変更したため、サーバーが負荷を処理しました。私はAmazon EC2にあり、20個のマイクロインスタンスを持つロードバランサを使用していました。それだけでは不十分でした。私は最終的に10の大きなインスタンスに変更し、それはOKでした。 しかし、大規模なインスタンスはちょっと高価です。私はそれほど大きなインスタンスを用意する余裕がありません(現在、負荷が少ないため、5つの大きなインスタンスが実行されていますが、 。

私はまだ最適化とサーバー構成に取り組んでいますが、私は一点に固執しています。

これまでのところ、私はmemcachedでsymfonyを使用しています。それは正常に動作し、キャッシュされるべきものはすべてキャッシュされます。

今、私はApache Webサーバーの前にワニスを追加したいと思います。

私はそれを行いました。私はそれを構成しました。私はそう思っています。今は実行中です。問題は、キャッシュにヒットがないことです。

私が見たことから、問題は、symfonyが送信したHTTPヘッダーが正しく設定されていないことです。 例えば、キャッシュされた要求のために、私は以下のヘッダがあります。

Expires: Thu, 19 Nov 1981 08:52:00 GMT 
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
    Pragma: no-cache 

モジュールが正しくなど、キャッシュを使用するように設定されていますが、私は正しいHTTPヘッダーを設定できる場所私は見つけることができません。私は特定のアクションのためにsymfonyのキャッシュヘッダを設定する方法を知っていますが、明らかに、私はすべてのアクションでそれをしたくありません(ちなみに、私が行ったとしても、これは正しい方法ではないと思います) 。

私が正しくsymfonyの
  • によって送信されたHTTPヘッダーを設定
    • 私はワニスのを設定します。だから私は、私は私が見たものから、symfonyの1.4 でニスを使用する方法を求めている

      は、二つの可能性がありますsymfonyから送信されるデフォルトのHTTPヘッダを正しく処理する

    いずれかの問題を解決する方法を知っていますか?

    ありがとう、

    N.B. :私はVarnish3

  • +0

    +1興味深い質問です。私もすぐにsymfony 1.4でワニスを使用します。私は答えを読むことに興味があるでしょう。 – Flukey

    答えて

    6

    日午前、私はようやく私の問題を解決する方法を自分で見つけたので、私は、私はそれをやった方法を共有するつもりです:

    を開始するには、あなたはsymfonyは自動的にPHPのセッションを作成することを知っている必要がありページが呼び出されるたびにだから、私がしたことは、そのデフォルトの動作を無効にすることでした。そうするために、私は工場に追加しました。に設定AUTO_STARTパラメータを持つ:ストレージ・工場(sfSessionStorageデフォルト1):YML

    storage: 
        class: sfSessionStorage 
        param: 
        auto_start: false 
    

    その後、私は、HTTPヘッダを処理するためのフィルタを作成しました:

    私が最初にこれを追加しましたfilteres.ymlのファイル

    http_header: 
        class: myHttpHeaderFilter 
    

    にそして私は私が望んでいたすべてのヘッダーを扱っlibフォルダ、上myHttpHeaderFilter.phpクラスを追加しました。例:

    class myHttpHeaderFilter extends sfFilter 
    { 
        public function execute($filterChain) 
        { 
         //execute the next filter in the chain 
         $filterChain->execute(); 
         //code after here runs after action 
    
         // Filters don't have direct access to the request and user objects. 
         // You will need to use the context object to get them 
         $request = $this->getContext()->getRequest(); 
         $path = $request->getPathInfo(); 
    
         if (substr($path, 0, 5) == "/foo") // We cache only some of the /foo requests 
         { 
          if (strstr($path, "bar")) // We cache the request containing bar during half an hour hour 
           $this->getContext()->getResponse()->addCacheControlHttpHeader('max-age=1800'); 
          else // All the other requests are cached during 24 hours 
          { 
           $this->getContext()->getResponse()->addCacheControlHttpHeader('max-age=86400'); 
          } 
         } 
         else // The other requests are not cached 
          $this->getContext()->getResponse()->addCacheControlHttpHeader('no-cache, no-store'); 
        } 
    } 
    

    これはそれでした。

    また、サーバーサイドでvcl_recvを変更して、キャッシュする必要のないすべてのリクエストがないようにしました(理論的には、symfonyで処理したため、必須ではありません。 "ダブルチェック")。

    sub vcl_recv { 
        if (req.http.Authorization || req.http.Cookie) { 
         /* Not cacheable by default */ 
         return (pass); 
        } 
    
        if (req.request != "GET" && req.request != "HEAD") { 
         /* We only deal with GET and HEAD by default */ 
         return (pass); 
        } 
    
        if (req.url ~ "/user") /* Requests containing user data are never cached */ 
         { 
           return (pass); 
         } 
    
        return (lookup); 
    } 
    
    +0

    こんにちは、ワニスでCSRFトークンをどうやって管理しましたか?各ページに(モーダルで)ログインフォームがあり、ワニスを使用したいが、問題を避ける方法がわからない。ありがとう! – fesja

    関連する問題