2011-11-22 64 views
4

昨天我的服務器負載很大,而且,即使我之前在優化性能(我在2個月前有過類似問題),我的服務器也無法處理負載(我有一項服務每分鐘約50個賬戶創建)。我們如何配置symfony 1.4與varnish一起使用?

最後,我的服務器負責處理負載,因爲我更改了實例:我在Amazon EC2上,並且使用了一個具有20個微型實例的負載均衡器。這還不夠。我終於變成了10個大型實例,那沒問題。但是,你知道,大型實例相當昂貴,而且我負擔不起那麼多大型實例(現在,因爲負載較少,我只有「5個大型實例正在運行,但它也太多了) 。

所以,我仍在努力進行優化和服務器配置,但我堅持一個觀點。

到目前爲止,我正在使用symfony和memcached。它工作正常,應緩存的所有內容都被緩存等。

現在,我想在我的apache web服務器前添加一個Varnish。

我這樣做了,我配置了它 - 我想 - 呃,現在它正在運行。問題在於緩存沒有命中。

從我看到的問題是,由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 1.4 從我所看到的,有兩種可能性:

  • 我正確設置由symfony的
  • 發送的HTTP報頭我配置清漆正確處理由symfony發送的默認HTTP頭

你知道我該如何解決其中一個問題?

謝謝,

N.B. :我在Varnish3

+0

+1有趣的問題。我也將很快使用symfony 1.4的清漆。我會對閱讀答案感興趣。 – Flukey

回答

6

我終於在我自己找到如何解決我的問題,所以我想分享我是如何做的:

開始時,你應該知道,symfony中自動創建一個PHP會議每次調用一個頁面。所以,我所做的就是停用該默認行爲。爲此,我加入了工廠。YML存儲工廠(默認之一:sfSessionStorage)與AUTO_START參數集

storage: 
    class: sfSessionStorage 
    param: 
    auto_start: false 

然後,我創建了一個濾波器來處理所述HTTP標頭:

我首先添加它到filters.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令牌的?我們在每個頁面上都有一個登錄表單(模式),我們希望使用Varnish,但我們不確定如何避免出現問題。謝謝! – fesja

相關問題