[英]Howto control Varnish and a Browser using Cache-Control: max-age Header in a Rails environment?
最近我在Rails应用程序堆栈中添加了一个Varnish实例。 可以通过使用Cache-Control Header缓存某个资源来确定其中的Varnish的默认配置,如下所示:
Cache-Control: max-age=86400, public=true
我使用控制器中的expires_in语句实现了那个:
def index
expires_in 24.hours, public: true
respond_with 'some content'
end
这很好用。 我没想到的是,Cache-Control标头也会影响浏览器。 这导致了 - Varnish和我的用户浏览器都缓存某个资源的问题。 资源将从varnish中正确清除,但除非达到max-age,否则浏览器不会再次尝试请求它。
所以我想知道我应该将'expires_in'与Varnish结合使用吗? 我可以在Varnish前面的Nginx或Apache实例中过滤Cache-Control标头,但这看起来很奇怪。
任何人都可以开导我吗?
问菲利克斯
这实际上是一个非常好的有效问题,也是一个非常常见的反向代理问题。
问题是只有一个Cache-Control属性,它适用于客户端浏览器(私有缓存)和/或代理服务器(共享缓存)。 如果您不希望第三方代理完全缓存您的内容,并希望每个请求都由您的Varnish(或您的Rails后端)提供,您必须从Varnish发送适当的Cache-Control标头。
修改后端发送的Cache-Control标头将在https://www.varnish-cache.org/trac/wiki/VCLExampleLongerCaching中详细讨论
您可以从两个不同的角度处理解决方案。 如果您希望在Rails后端定义max-age,例如为不同的对象指定不同的TTL,则可以使用上面链接中描述的方法。
另一个解决方案是不从后端发送Cache-Control头,而是在varnish vcl_fetch()中为对象定义所需的TTL。 这是我们采取的方法。
我们在Varnish中有一个600秒的默认TTL,并为进行更改时明确清除的页面定义更长的TTL。 这是我们当前的vcl_fetch()定义:
sub vcl_fetch {
if (req.http.Host ~ "(forum|discus)") {
# Forum pages are purged explicitly, so cache them for 48h
set beresp.ttl = 48h;
}
if (req.url ~ "^/software/") {
# Software pages are purged explicitly, so cache them for 48h
set beresp.ttl = 48h;
}
if (req.url ~ "^/search/forum_search_results" ) {
# We don't want forum search results to be cached for longer than 5 minutes
set beresp.ttl = 300s;
}
if(req.url == "/robots.txt") {
# Robots.txt is updated rarely and should be cached for 4 days
# Purge manually as required
set beresp.ttl = 96h;
}
if(beresp.status == 404) {
# Cache 404 responses for 15 seconds
set beresp.http.Cache-Control = "max-age=15";
set beresp.ttl = 15s;
set beresp.grace = 15s;
}
}
在我们的例子中,我们根本不从Web后端服务器发送Cache-Control头。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.