Varnish似乎正在工作,但max-age = 0

时间:2015-07-18 09:36:00

标签: ubuntu caching http-headers apache2 varnish

isvarnishworking.com让我知道

  

Varnish似乎在该网址响应,但缓存控制   header的“max-age”值小于1,这意味着Varnish会   永远不会在此网址上提供缓存中的内容。

     

max-age值似乎是:0

此标题信息

The url we checked: myDomainHere.com
    HTTP/1.1 200 OK
Server: Apache/2.4.7 (Ubuntu)
X-Powered-By:   PHP/5.5.9-1ubuntu4.5
Set-Cookie: PHPSESSID=vgk7db66kh7nce8lpe5789u105; path=/
Expires:    Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control:  max-age=60, private, proxy-revalidate
Pragma: no-cache
Vary:   Accept-Encoding,User-Agent
Content-Encoding:   gzip
Content-Type:   text/html
Content-Length: 14192
Accept-Ranges:  bytes
Date:   Sat, 18 Jul 2015 09:31:55 GMT
X-Varnish:  324589322
Age:    0
Via:    1.1 varnish
Connection: keep-alive

我在.htaccess中有这个

 <FilesMatch "\.(js|css)$">
    Header set Cache-Control "max-age=604800, public"
</FilesMatch>
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|swf)$">
    Header set Cache-Control "max-age=604800, public"
</FilesMatch>
<FilesMatch "\.(html|htm|php)$">
    Header set Cache-Control "max-age=60, private, proxy-revalidate"
</FilesMatch>

所以我的问题,我真的必须改变max-age = 0才能使清漆表现更好吗?如果是这样,我会在哪里这样做?我在ubuntu digitalocean的droplet上使用apache2

-edit -

这是我的/etc/varnish/default.vcl

# This is a basic VCL configuration file for varnish.  See the vcl(7)
# man page for details on VCL syntax and semantics.
#
# Default backend definition.  Set this to point to your content
# server.
#
backend default {
    .host = "127.0.0.1";
    .port = "8080";
}
#
# Below is a commented-out copy of the default VCL logic.  If you
# redefine any of these subroutines, the built-in logic will be
# appended to your code.
# sub vcl_recv {
#     if (req.restarts == 0) {
#       if (req.http.x-forwarded-for) {
#           set req.http.X-Forwarded-For =
#               req.http.X-Forwarded-For + ", " + client.ip;
#       } else {
#           set req.http.X-Forwarded-For = client.ip;
#       }
#     }
#     if (req.request != "GET" &&
#       req.request != "HEAD" &&
#       req.request != "PUT" &&
#       req.request != "POST" &&
#       req.request != "TRACE" &&
#       req.request != "OPTIONS" &&
#       req.request != "DELETE") {
#         /* Non-RFC2616 or CONNECT which is weird. */
#         return (pipe);
#     }
#     if (req.request != "GET" && req.request != "HEAD") {
#         /* We only deal with GET and HEAD by default */
#         return (pass);
#     }
#     if (req.http.Authorization || req.http.Cookie) {
#         /* Not cacheable by default */
#         return (pass);
#     }
#     return (lookup);
# }
#
# sub vcl_pipe {
#     # Note that only the first request to the backend will have
#     # X-Forwarded-For set.  If you use X-Forwarded-For and want to
#     # have it set for all requests, make sure to have:
#     # set bereq.http.connection = "close";
#     # here.  It is not set by default as it might break some broken web
#     # applications, like IIS with NTLM authentication.
#     return (pipe);
# }
#

2 个答案:

答案 0 :(得分:4)

  

我是否真的必须更改max-age = 0才能进行清漆   更好?

是。如果您希望它完全执行, 需要。

  

如果是这样,我会在哪里这样做?

看起来你有一切正确的缓存静态内容,但你似乎也想缓存PHP脚本执行响应:

您只是缺少session_cache_limitersession_cache_expire,这应该是在请求的PHP脚本上执行的第一行,甚至在session_start() 之前。

例如,如果返回的内容是私有的,并且您希望每分钟刷新一次,请尝试以下操作:

session_cache_limiter('private');
session_cache_expire(1);

之后,对于PHP生成内容(包括脚本开头的那些行)的请求,您应该在Varnish响应中看到正确的Cache-Control: max-age=60, private值。

[更新] 看到你的问题还没有解决,也许你应该尝试使用Apache mod_expires而不是手动设置Cache-Control标头:http://httpd.apache.org/docs/2.4/mod/mod_expires.html

这应该回答你的问题,但请允许我给你一些额外的注意事项,这些注释可能对你有用,并帮助你更好地理解Varnish和Cache-Control标题之间的关系:

  • 使用响应上的默认配置max-age=0表示Varnish和 浏览器,响应不可缓存。除非在客户的请求中另外配置或明确允许,否则使用Varnish will not serve stale content
  

任何缓存都不会返回过时的缓存项(代理缓存或   客户端缓存)。

来自https://tools.ietf.org/html/rfc7234#section-5.3

  

如果响应包含具有max-age
的Cache-Control字段   指令(第5.2.2.8节),收件人必须忽略Expires
  领域。同样,如果响应包含s-maxage指令
  (第5.2.2.9节),共享缓存接收者必须忽略Expires
  领域。在这两种情况下,Expires中的值仅用于   对于尚未实现Cache-Control字段的收件人。

来自http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.3

  

如果缓存返回陈旧响应,则可能是因为max-stale   对请求的指令,或者因为缓存配置为覆盖   响应的到期时间,缓存必须附加警告   标题为陈旧响应,使用警告110(响应失效)。

     

缓存可以配置为在没有的情况下返回陈旧的响应   验证,但前提是这与任何&#34; MUST&#34; -level没有冲突   有关缓存验证的要求(例如,&#34;必须重新验证&#34;   缓存控制指令)。

     

如果新请求和缓存条目都包含&#34; max-age&#34;   指令,然后两个值中较小的一个用于确定   该请求的缓存条目的新鲜度。

  • Varnish的主要目的是存储内存中可缓存的响应 (虽然它们是新鲜的)所以它们可以被发送到相同或不同的 客户端没有重新生成它们,也有利于负载平衡 如果需要的话。

  • 当要求提供新鲜内容时,清漆不会提供陈旧内容 (最常见的情况),即使它确实如此,the browser would not be saving it并且每次都会生成一个新页面的新请求 用户请求该内容的时间,不必要地访问缓存 (涉及所有网络活动)而不是渲染 本地存储的副本,这将是非常低效和明显的 慢!

  

max-age表示客户端愿意接受响应   其年龄不大于指定的秒数。除非   最大指令也包括在内,客户不愿意   接受陈旧的回应。

现在,如果您仍然看到每次加载内容时浏览器都会发送新请求(请查看浏览器的网络选项卡的开发人员工具或varnish logs),请重新检查所有内容。作为最后的手段,你也可以try to set the proper html meta tags,虽然html5 deprecates them并且它们对于任何现代浏览器都不是必需的,但这不是最佳做法,所以我会反对它。

此处还有some good reading对您可能感兴趣的PHP脚本生成的内容进行适当的缓存控制。

答案 1 :(得分:1)

您的清漆VCL是不够的。根据您的清漆版本搜索并使用相应的VCL 3或VCL 4模板。

检查您的清漆版本:varnishd -V

如果您使用的是版本2,请升级到版本3或4。

VCL for Varnish 3: https://github.com/dreamhost/varnish-vcl-collection

VCL for Varnish 4: https://github.com/mattiasgeniar/varnish-4.0-configuration-templates/blob/master/default.vcl