【问题标题】:Varnish Cache not caching PHP pages when session_start() is used使用 session_start() 时清漆缓存不缓存 PHP 页面
【发布时间】:2011-07-02 10:48:52
【问题描述】:

我是第一次使用 Varnish Cache 并且没有任何乐趣让它按照我的意愿工作。

我的问题似乎很简单。

我只希望 .php 页面被缓存。

到目前为止,每个 .php 请求总是通过清漆 缓存并访问我的 apache Web 服务器。

问题在于 cookie 和对 session_start() 的调用;

没有 session_start() = 缓存 使用 session_start() = 无缓存

现在文档很简单,可以理解 但我尝试过并没有成功。尽快 当我添加对 session_start() 的调用时 = 不再缓存。

这是带有 PHP 的示例 HTML:

<?php 
session_start(); 
?>

<html>
<head>
</head>
<body>  

<?php echo date('Y-m-d H-i-s'); ?>

</body>
</html>

这是我非常干净简单的清漆 default.vcl

backend default {
    .host = "127.0.0.1";
    .port = "8080";
}

sub vcl_recv {
  unset req.http.Cookie;
  return (lookup);
}

sub vcl_fetch {
    if (beresp.http.Set-Cookie) {
        unset beresp.http.Set-Cookie;
        return (deliver);
    }
}

这应该从客户端和服务器取消设置 Cookie 它似乎确实如此。使用 FireBug 进行调试时 在 FireFox 中,我可以看到 Set-Cookie 和 Cookie HTTP 标头 当我使用这个 default.vcl 时不在那里

这是来自 FireFox 的 HTTP 标头:

响应标头:

HTTP/1.1 200 OK
Server: Apache/2.2.16 (Debian)
X-Powered-By: PHP/5.3.3-7
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
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Type: text/html
Content-Length: 192
Date: Wed, 23 Feb 2011 01:34:17 GMT
X-Varnish: 2052563421
Age: 0
Via: 1.1 varnish
Connection: keep-alive

Request Headers:

GET /test.php HTTP/1.1
Host: xshare.com.local
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Cache-Control: max-age=0

我就是看不出哪里出错了。 我已经修补了 2 个小时,添加/更改和删除 .vcl 配置文件的行和变体。

谁能给点建议?

非常感谢。

【问题讨论】:

    标签: php caching session varnish


    【解决方案1】:

    您现在可能已经发现,缓存和 cookie 不匹配。在上面的示例中,您正在删除会话 cookie(以及所有其他 cookie),因此在以这种方式使用 Varnish 时,您的会话将不可用。

    您可以做 2 件事: - 允许 cookie 但不缓存登录用户 - 除非你真的需要,否则不要使用会话(或 cookie)

    第三种更复杂的解决方案是去除大多数页面的 cookie,但允许它们用于某些页面,然后您将其作为 ESI 块处理。有很多关于这方面的文档。

    【讨论】:

      【解决方案2】:

      我发现了现在的规则组合 缓存带有 session_start() 的 .php 页面。

      我已经离开了,但注释掉了其中一些 我一直在尝试。

      试错法现在只需要 2 条配置规则。

      一个用于客户端,一个用于服务器。

      Client = unset req.http.Cookie;
      
      Server = set beresp.ttl = 5d;
      
      backend default {
          .host = "127.0.0.1";
          .port = "8080";
      }
      
      sub vcl_recv {
        unset req.http.Cookie;
      #  unset req.http.Cache-Control;
        return (lookup); 
      }
      
      sub vcl_fetch {
           if (beresp.http.Set-Cookie) {
               set beresp.ttl = 5d;
      #         unset beresp.http.Set-Cookie;
      #         unset beresp.http.Expires;
      #         unset beresp.http.Cache-Control;
               return (deliver);
           }
      }
      

      干杯。

      【讨论】:

      • 如果您不从 beresp 中去除 set-cookies,您将为所有用户缓存相同的 cookie!
      • 会话的全部意义在于它对用户来说是唯一的——这就是为什么 varnish 默认不缓存它们,
      猜你喜欢
      • 2012-04-03
      • 1970-01-01
      • 1970-01-01
      • 2016-04-19
      • 2021-08-05
      • 1970-01-01
      • 2012-11-12
      • 2023-04-11
      • 2018-04-07
      相关资源
      最近更新 更多