【问题标题】:Codeigniter : Varnish and Cookie / Session conflictCodeigniter:清漆和 Cookie / 会话冲突
【发布时间】:2015-04-22 09:23:40
【问题描述】:

我有一个依赖会话和 cookie 的网站。我想在上面实现 Varnish 缓存。

  1. 当浏览器打开时,网站具有相同的会话 ID,直到浏览器关闭。但是标题中的 AGE 值仍然是 0 。此 AGE 值描述 varnish 是否正在缓存页面。 0 表示不缓存。

  2. 要检查 Varnish 缓存是否正常工作,curl -I domainname 是命令,我通过终端点击此命令,标题在每个 HIT 上给出 不同的 PHPSESSIONID AGE的值也保持为0。

无法准确确定是什么不允许网站被 Varnish 缓存。

只是为了测试我commented the session_start(),这里有以下观察。 在浏览器上

  1. 没有在浏览器中创建会话 ID cookie。
  2. 对于同一页面上的多次点击,AGE 仍为 0。

在终端上

  1. 标头响应中未显示 php 会话 ID。
  2. 第一次点击的年龄值为 0,但在以后的点击中,它不断获得递增的数值。

Varnish 似乎无法缓存浏览器点击。特别是在指定域时。

任何帮助如何让清漆缓存为基于会话的网站工作?

【问题讨论】:

    标签: php session caching varnish


    【解决方案1】:

    Varnish 默认不缓存设置 cookie 的页面。解决这个问题有两种方法:

    1. 从页面中删除 cookie。这仅适用于页面首先不需要会话(即它没有特定于用户的内容)的情况。你可以这样做:

      // ... default.vcl
      sub vcl_recv {
        unset req.http.Cookie;
      
        return(hash);
      }
      
    2. 将 cookie 添加到 Varnish 生成的哈希中,这意味着每个会话都将拥有自己的缓存(它仍然会提高性能,但远没有您可以选择选项 1 那样显着。像这样:

      // ... default.vcl
      sub vcl_hash {
        hash_data(req.url);
      
        if (req.http.host) {
          hash_data(req.http.host);
        } else {
          hash_data(server.ip);
        }
      
        hash_data(req.http.Cookie);
      
        return(lookup);
      }
      

    您可能有一些页面上似乎没有特定于用户的内容(例如,假设您有一个博客,博客帖子不需要用户特定的内容),但您可能有一些东西表明用户是否是登录。如果您可以通过 AJAX 对非缓存或按会话缓存的端点进行此操作,那么一切正常。

    使用选项 2,您可能会发现需要将 Cookie 临时存储在另一个标头中,以便 Varnish 实际缓存页面,您可以这样做:

    // ... default.vcl
    sub vcl_recv {
      set req.http.X-Cookie = req.http.Cookie;
      unset req.http.Cookie;
    
      return(hash);
    }
    

    然后只需将vcl_hash 函数更改为使用req.http.X-Cookie 而不是req.http.Cookie

    【讨论】:

    • 我尝试了第二个选项,编辑了 default.vcl。并评论了session_start()。因此不会创建会话。在浏览器上点击 URL。这是响应:Accept-Ranges bytes Age 0 Cache-Control max-age=3600 Connection keep-alive Content-Type text/html; charset=UTF-8 Date Wed, 22 Apr 2015 17:59:57 GMT Expires Thu, 19 Nov 1981 08:52:00 GMT Pragma cache Server Apache/2.2.15 (CentOS) Transfer-Encoding chunked Via 1.1 varnish-v4 X-Powered-By PHP/5.3.3 X-Varnish 21 AGE = 0 多次点击。似乎在浏览器上点击时它起作用了。
    • 问题是您的过期标头。它是过去的,因此 Varnish 不会缓存它。 PHP 设置了一些它自己的标题,因为它喜欢认为它很有帮助。看看这个:php.net/manual/en/function.session-cache-limiter.php
    • 我尝试使用curl -I domainname 在终端上点击,这是回复:HTTP/1.1 200 OK Date: Wed, 22 Apr 2015 18:01:59 GMT Server: Apache/2.2.15 (CentOS) X-Powered-By: PHP/5.3.3 Pragma: cache Cache-Control: max-age=3600 Content-Type: text/html; charset=UTF-8 X-Varnish: 98369 32857 Age: 87 Via: 1.1 varnish-v4 Content-Length: 28357 Connection: keep-alive
    • 看起来缓存对您输入的最后一条评论有效,注意年龄标头?
    • 哦,如果您还没有注意到的话,您可能会发现一件事很有用,那就是当 Varnish 成功缓存某些内容时,您会看到 X-Varnish 标头有 2 个数值,而不是一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 2012-08-19
    • 2012-08-15
    • 1970-01-01
    • 2018-05-26
    • 2020-06-23
    相关资源
    最近更新 更多