2011-11-22 41 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

相关问题