- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个位于 Varnish 后面的 Plone 网站。除了一件事之外,一切正常。
这是一个动态网站,因此会不时出现新内容。场景如下:
我有一个显示项目列表的页面。该页面已被缓存。因此,我通过某种形式添加另一个项目,然后返回到同一页面,但新项目未显示。这是因为显示的页面来自缓存并且仍在其 TTL 内。
如何确保在提交新项目后,该页面会从缓存中清除,并会显示来自后端服务器的包含新项目的新页面?
我的简单VCL如图所示:
backend default {
.host = "127.0.0.1";
.port = "8080";
}
sub vcl_recv {
if (req.request != "GET" && req.request != "HEAD") {
# We only deal with GET and HEAD by default
return (pass);
}
# remove unnecessary cookies
if (req.http.cookie ~ "wc.cookiecredentials|Path|Domain") {
# found wc.cookiecredentials in request, passing to backend server
return (lookup);
} else {
unset req.http.cookie;
}
}
sub vcl_fetch {
#unset beresp.http.Set-Cookie;
set beresp.ttl = 12h;
return(deliver);
}
# Routine used to determine the cache key if storing/retrieving a cached page.
sub vcl_hash {
# Do NOT use this unless you want to store per-user caches.
if (req.http.Cookie) {
set req.hash += req.http.Cookie;
}
}
sub vcl_deliver {
# send some handy statistics back, useful for checking cache
if (obj.hits > 0) {
set resp.http.X-Cache-Action = "HIT";
set resp.http.X-Cache-Hits = obj.hits;
} else {
set resp.http.X-Cache-Action = "MISS";
}
}
或者说白了,当我收到 POST 请求时,如何清除或清除域的整个缓存?
最佳答案
要实现此目的,您需要自定义 Varnish VCL 来处理 PURGE
请求和 Plone CMS,以便在内容更改时向 Varnish 发出清除请求。
Plone 开发者文档在 using Varnish with Plone 上有非常好的和全面的文档。 。您可以根据您的具体需求进行调整。
文档中的示例解释了如何在 VCL 中创建自定义 ACL 和正则表达式清除处理,以及如何在 Plone 中使用它来清除整个缓存。我从此处的示例中复制了 VCL 和 Plone View ,以防万一它们将来某个时候从 Plone 站点中删除:
acl purge {
"localhost";
# XXX: Add your local computer public IP here if you
# want to test the code against the production server
# from the development instance
}
...
sub vcl_recv {
...
# Allow PURGE requests clearing everything
if (req.request == "PURGE") {
if (!client.ip ~ purge) {
error 405 "Not allowed.";
}
# Purge for the current host using reg-ex from X-Purge-Regex header
purge("req.http.host == " req.http.host " && req.url ~ " req.http.X-Purge-Regex);
error 200 "Purged.";
}
}
然后,为 Plone 创建一个自定义 View ,用于向 Varnish 发出 PURGE
请求:
import requests
from Products.CMFCore.interfaces import ISiteRoot
from five import grok
from requests.models import Request
class Purge(grok.CodeView):
"""
Purge upstream cache from all entries.
This is ideal to hook up for admins e.g. through portal_actions menu.
You can access it as admin::
http://site.com/@@purge
"""
grok.context(ISiteRoot)
# Onlyl site admins can use this
grok.require("cmf.ManagePortal")
def render(self):
"""
Call the parent cache using Requets Python library and issue PURGE command for all URLs.
Pipe through the response as is.
"""
# This is the root URL which will be purged
# - you might want to have different value here if
# your site has different URLs for manage and themed versions
site_url = self.context.portal_url() + "/"
headers = {
# Match all pages
"X-Purge-Regex" : ".*"
}
resp = requests.request("PURGE", site_url + "*", headers=headers)
self.request.response["Content-type"] = "text/plain"
text = []
text.append("HTTP " + str(resp.status_code))
# Dump response headers as is to the Plone user,
# so he/she can diagnose the problem
for key, value in resp.headers.items():
text.append(str(key) + ": " + str(value))
# Add payload message from the server (if any)
if hasattr(resp, "body"):
text.append(str(resp.body))
如上所述,这只是根据需要清除整个缓存。我不是 Plone 方面的专家,因此我无法为您提供有关如何使其适应仅清除特定内容的详细答案。基本上,您需要确定在特定情况下需要清除哪些页面,然后调整上面的示例,以便在 Plone 中处理 POST
请求时自动向 Varnish 发出 PURGE
请求.
单独在 VCL 中处理清除(即检测 POST 调用并根据这些调用清除内容)相当复杂。我相信在 Plone 中处理逻辑和清除会更加有效。
更新:
如果您希望在每次POST
时清除整个缓存,可以按如下方式完成。
sub vcl_recv {
if ( req.request == "POST") {
ban("req.http.host == " + req.http.Host);
return(pass);
}
}
现在,每个 POST
请求都会导致在同一主机名下缓存的所有页面从缓存中清除。但从长远来看,我建议研究早期的解决方案。当 POST
发生时,仅清除实际需要清除的页面会更有效。
关于caching - Varnish:POST 数据后清除缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14518229/
我一生都找不到有关 Varnish (版本 3)对象可能属性的任何文档。 我们知道(从谷歌搜索中,varnish 文档只是咕哝,让你更加沮丧)例如,请求对象具有 url 属性(req.url),并且它
我们公司最近决定开始使用 Varnish HTTP 加速器。我们选择这个解决方案的最重要原因是因为我们是一家专门构建网络商店的公司 (Magento Enterprise) => Magento 有一
我们最近将Varnish放在了Drupal的前面,因为服务器承受着沉重的负担,总体而言,我们感到非常满意。 剩下的唯一问题是,有时我们在缓存的数据中会有一个无限的重定向循环。我们通过HTTP监控发现了
我正在设置连接到2个后端服务器(Magento 2应用程序)的Varnish 5实例。 我正在使用新的Varnish 5功能来加载多个VCL文件。为了使事情现在变得非常简单,我将在示例中使用1个后端服
我有一台 Vanilla 的Debian DigitalOcean机器,我正在尝试遵循《 Varnish 书》中的“开发人员”类(class)。我必须the first exercise, Insta
我已经为我的网站配置了Varnish,并且由于网站性能出色,但是没有人知道有任何Varnish监视工具可以查看Varnish中存储的内容以及与Memcached或APC监视工具类似的东西。 谢谢, -
我正在寻找 Varnish 高可用性设置的最佳设置。 具有多个 Varnish 实例的标准设置,每个实例都有自己的缓存存储,因此每个实例都在后端执行自己的请求。 即使使用 Varnish_Storag
我已经经历了这个 article 。有人可以帮我澄清以下有关 Varnish 各种日志位置的疑问吗? 根据 varnish 电子书 varnishncsa -显示 Varnish 访问日志和 varn
在不停机的情况下以编程方式向 Varnish director 添加或删除单个后端服务器的最佳方法是什么?我一直在寻找这方面的一个很好的例子,但找不到。 我希望能够根据需要扩展和缩减我的后端服务器。
我已经安装了 Apache 和 Tomcat,想在它们前面安装 Varnish,静态到 Apache,动态到 Tomcat(所有/static/* url 到 Apache,应该由 Varnish 缓
我目前正在做一个基于 Varnish 的项目。 我们写 vcl和 vmod .但是项目需要检查请求体。 如何在 VCL 中获取帖子请求正文或 vmod与 C function ? 最佳答案 你几乎可以
我习惯跑 varnishadm -T localhost:6082 debug.health 检查后端健康状态,但如何详细检查探测失败的原因(例如超时、错误的 http 状态代码)? 最佳答案 在 V
我正在尝试设置我的第一个 Varnish 缓存服务器,我有几个问题想问任何有经验的人。 1.) 我将 Varnish 作为独立服务器运行。我还需要在同一台服务器上安装 Apache 吗?最终,Varn
抱歉,我是 Varnish 的新手。 我正在我的 /etc/varnish/mysite.vlc 中尝试一堆东西,但无法让它工作。 我想将特定网址重定向到另一个网址。例子:如果有人访问 http://
我有这个: if (bereq.http.X-Path ~ "[a-z0-9]+\.(js|css)$") { set beresp.http.Cache-Control =
我想将Varnish用作“智能”代理,并且几乎可以正常工作。这个想法是,某些请求应通过Varnish传递,到达后端并返回,所有其他请求应返回“synt”消息,表明特定响应不包含任何结果。 这与Varn
我们将Varnish Cache用作许多客户的前端,并在任何后端出现问题时通过宽限期处理过时的内容。 我们现在确实有一个失败的后端,并且我们想增加宽限期(在生病的时候),这可能吗?我尝试在文档中进行挖
我们想要建立一个 Varnish 级联,以便我们进行1级和2级缓存。这意味着应要求 -1级 Varnish 的工艺和路线 -通往的 Varnish 等级2 - 应用 问题:如果应用程序现在在内容中添加
我在vcl中使用循环导演。我想查看所有缓存未命中URL和后端IP。现在在做sudo varnishtop -i BereqURL它只显示网址而不是后端IP的去向 54.42 BereqURL
是否可以设置 Varnish 以定期重建整个 field ?我在 Varnish 后面有一个播放应用程序。该应用程序生成了超过2,000页的网站号,其中大多数是产品页。是否可以将Varnish设置为从
我是一名优秀的程序员,十分优秀!