我用Apache配置了Varnish 3,它运行得很好.但是我无法在Apache日志中记录客户端IP.我试了几个解决方案,没有运气.现在我的Apache访问日志文件正在记录服务器IP而不是客户端IP地址.
以下是我的配置供您考虑:
光油VCL:(/etc/varnish/default.vlc):http://pastebin.com/PuBqZ6fx
/etc/httpd/conf/httpd.conf中
LogFormat"%{X-Forwarded-For} i%l%u%t \"%r \"%> s%b \"%{Referer} i \"\"%{User-Agent} i \""varnishcombined
......其他东西...... ErrorLog日志/ fr-error-log CustomLog日志/ fr-custom-log varnishcombined ......其他东西......
注意:安装的Varnish版本是varnish-3.0.2-1.el5.x86_64
谢谢.Raheel
清漆默认行为是永远不会查找包含Cookie标头的请求.换句话说,Cookie永远不会缓存包含标头的请求.我需要覆盖此行为以忽略带有Cookie标头的请求.
考虑我的应用程序中的下一个用户行为:
/),页面应该被缓存,后端返回public缓存控件,一切都很好,页面被Varnish缓存./not-cacheable不可缓存的自定义页面(),后端返回private缓存控件.还会Set-Cookie在响应中返回标头.Varnish忽略了这个请求,用户最终得到了一个cookie.到现在为止还挺好./),记住,已经缓存了.问题是,用户请求现在带有Cookie标题.这会导致Varnish忽略该请求并委托给后端.删除Cookie 将不起作用,因为当用户返回/not-cacheable路线时,他将看不到他的个性化页面,因为Cookie标题已被条带化.相反,后端返回一个新生成的会话,其中包含一个新的id Set-Cookie.
此外,Cookie在Varnish中查找每个请求都会导致每个请求(有关方法或后端响应)被缓存.
如果有一种方法告诉Varnish只是忽略Cookie标头,这样我就可以通过让后端决定请求是否可以缓存来缓存具有该标头的请求.
有任何想法吗?
好吧,我会保持简单,PURGE请求(或者我认为?)几乎全部由字面处理:
acl purge {
"localhost";
"127.0.0.1";
}
Run Code Online (Sandbox Code Playgroud)
然后
if (req.method == "PURGE") {
if (!client.ip ~ purge) {
return(synth(405, "This IP is not allowed to send PURGE requests."));
}
return (purge);
}
Run Code Online (Sandbox Code Playgroud)
我相当肯定上述两个陈述都是"正确的",我挂断的是如果我发送了一个
curl -X PURGE http://domain.com/
Run Code Online (Sandbox Code Playgroud)
要么
curl -X PURGE http://domain.com/.*
和Varnish发回200 Purged well ...缓存被清除了?即使它只是主页而不是整个缓存(发誓它都是使用上面的.*方法)并且上面的代码片段是正确的有任何特殊原因http://domain.com(如在实际的主页中) )没有被清除?
varnishncsa显示:
MYIP - - [16/Feb/2015:23:23:10 -0600] "PURGE http://domain.com/ HTTP/1.1" 200 241 "-" "curl/7.29.0"
Run Code Online (Sandbox Code Playgroud)
我知道我得失去一些愚蠢的东西,但我无法弄明白吗?
所以我有点奇怪.我有一台运行Nginx,Varnish,php-fpm和wordpress/woocommerce的debian 9机器.该网站基本上有效,但我有一些奇怪的问题,添加到购物车.
测试环境在https://awstesting.amr.com.au上
具体来说,在主页上有"添加到购物车"按钮.在页面加载时,您可以添加2个不同的产品,但是如果您尝试使用第3个产品,它将使用502的ajax调用失败.
这是点击添加到购物车时的常规标题部分:
Request URL: https://awstesting.amr.com.au/?wc-ajax=add_to_cart
Request Method: POST
Status Code: 502
Remote Address: 13.236.17.191:443
Referrer Policy: no-referrer-when-downgrade
Run Code Online (Sandbox Code Playgroud)
我现在将添加我的Varnish配置:(我正在使用Varnish 5.2)
vcl 4.0;
backend default {
.host = "127.0.0.1";
.port = "8080";
.connect_timeout = 600s;
.first_byte_timeout = 600s;
.between_bytes_timeout = 600s;
.max_connections = 800;
}
acl purger {
"localhost";
"127.0.0.1";
}
sub vcl_recv {
# pipe on weird http methods
if (req.method !~ "^GET|HEAD|PUT|POST|TRACE|OPTIONS|DELETE$") {
return(pipe);
}
if (req.method != "GET" && req.method != "HEAD") {
return(pass);
} …Run Code Online (Sandbox Code Playgroud) 我的清漆版本是3.0.
当我卷曲URL时,我的服务器运行良好,但是当使用varnish cache时,它503 service unavailable会偶尔返回.
日志信息喜欢的是:
0 Debug - "VCL_error(200, OK)"
24 VCL_call c recv error
24 VCL_call c error deliver
24 SessionClose c error
0 Debug - "VCL_error(200, OK)"
27 VCL_call c recv error
27 VCL_call c error deliver
27 SessionClose c error
0 Debug - "VCL_error(200, OK)"
16 VCL_call c recv error
16 VCL_call c error deliver
16 SessionClose c error
14 Debug - "Write error, retval = 2998272, len = 8465870, errno = …Run Code Online (Sandbox Code Playgroud) 我正在使用Drupal 7最新开发版.
我已经安装了Varnish和Expire模块并进行了设置.他们工作得很好但我有一个关于从varnish删除缓存的问题.
问题是如何仅为索引(主页)页面删除清漆缓存而不删除其他页面的缓存.我看看他的清漆日志,我发现每次Drupal执行命令时都会删除整个清漆缓存
ban req.http.host ~ www.cdm.me && req.url ~ "/"
Run Code Online (Sandbox Code Playgroud)
该命令由varnish模块或expire模块执行,表示删除home(index)页面的缓存.但正如我所看到的那样,它正在删除varnish中的所有缓存页面.
如何解决这个问题?如何只删除主页的缓存?
如果我想让我的清漆缓存服务器在服务或存储页面(vcl_fetch?)之前从后端替换页面内的内容(即:更改div上的类),该怎么做?
我想使用简单的正则表达式来执行替换,因为我想它本身在清漆中受支持。
我管理的站点只有一个 cookie,我们必须使用它,但它始终是 9 个值之一(包括没有值)。我想在我们的应用程序服务器前使用 varnish,varnish 根据 cookie 值分别缓存每个页面的一个版本。
因此,如果我们有页面 /page1,Varnish 应该单独管理 /page1 外观的副本,其中包含 cookie 值 a、b、c、d 等......
假设我们在 Varnish 服务器上有足够的内存来处理存储所有带有所有 cookie 组合的页面。
我们已经尝试了许多 VCL 设置,但无法确切地弄清楚如何进行这项工作。Varnish 还需要将该特定 cookie 发送到我们的应用程序服务器,以便我们的应用程序知道要发送回哪些内容。
提前致谢!
我有2个环境变量:
echo $FRONT1_PORT_8080_TCP_ADDR # 172.17.1.80
echo $FRONT2_PORT_8081_TCP_ADDR # 172.17.1.77
Run Code Online (Sandbox Code Playgroud)
我想将它们注入我的default.vcl中,如:
backend front1 {
.host = $FRONT1_PORT_8080_TCP_ADDR;
}
Run Code Online (Sandbox Code Playgroud)
但是我在$char 上遇到了语法错误.
我也试过用户变量,但我无法在外面定义它们vcl_recv.
如何在VCL中检索我的2个值?
我正在 Digital Ocean Ubuntu VM 上运行一个独立的 varnish 实例,它基本上工作正常。该设置用于加载位于其他任何地方的旧 wordpress 服务器。这很有效,但我很难清除内容。在谈论清除时,我的意思是使 URL 的缓存无效以强制清漆从后端获取新版本(只是为了确保我看到了对清除/禁止的一些刺激)。
我已经设置了一个用于清除的 ACL,就我在 varnishlog 中看到的而言,清除被接受 - 一方面来自 WordPress 博客(W3TC 处理清除的地方)以及来自我尝试使用 curl 清除的本地控制台的 es - X PURGE http://url.to.purge
问题是,无论我在本地做什么,我仍然会在浏览器中获得旧版本的 URL。
这就是我在 vcl_recv 中处理清除的方式:
if (req.method == "PURGE") {
if (!client.ip ~ purge) {
return(synth(405,"Not allowed."));
}
return (purge);
}
Run Code Online (Sandbox Code Playgroud)
我在每次清除时都会收到 VCL_error(200, Purged) 所以我想这可能没问题。
看来我还是做错了。在重新启动服务清漆后,完整的缓存会刷新,页面也会刷新 - 在此之前清漆会保留所有内容 - 无论我清除多少。
我的清漆版本是 4.0.3。
任何的想法?
谢谢,
坦率