我是配置 varnish 的新手。我正尝试将我在 AWS 上设置的 varnish 复制到另一台服务器上。以下是场景:
我有 2 台服务器提供 Web 内容(Web1 和 Web2),它们是一对负载均衡的服务器。Web1 正在运行且配置正确,目前我只有 Web2 通过 Varnish 指向 Web1。
/etc/sysconfig/varnish 的内容如下:
NFILES=131072
MEMLOCK=82000
RELOAD_VCL=1
DAEMON_OPTS="-a :80 \
-T localhost:6082 \
-f /etc/varnish/default.vcl \
-u varnish -g varnish \
-S /etc/varnish/secret \
-s file,/var/lib/varnish/varnish_storage.bin,1G"
下面是我的 /etc/varnish/default.vcl 的内容(请注意,我在这里替换了主机的 IP 地址)。我目前有一个裸 VCL,并且它正在运行:
backend default {
.host = "xxx.xxx.xxx.xxx";
.port = "80";
}
sub vcl_recv {
}
现在,如果我开始在 vcl_recv 内部添加“宽限期”设置,如下所示,Varnish 将拒绝启动:
backend default {
.host = "xxx.xxx.xxx.xxx";
.port = "80";
}
sub vcl_recv {
set req.grace = 24h;
}
如果我尝试添加 vcl_fetch,它会直接拒绝工作:
backend default {
.host = "xxx.xxx.xxx.xxx";
.port = "80";
}
sub vcl_recv {
}
sub vcl_fetch {
}
我不确定我遗漏了什么。这可能是显而易见的事情,但我还没有足够的经验来意识到这一点。
我在我们的 AWS 服务器上运行着一些更复杂的东西,类似这样的,它正在运行:
sub vcl_recv {
set req.grace = 24h;
if (!req.backend.healthy) {
unset req.http.Cookie;
}
if (req.url ~ "(?i)\.(svg|png|gif|jpeg|jpg|ico|swf|css|js|html|htm)(\?[a-z0-9]+)?$") {
unset req.http.Cookie;
}
set req.http.Cache-Control = "public; max-age=31557600";
if (req.http.Accept-Encoding) {
if (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip";
}
else if (req.http.Accept-Encoding ~ "deflate") {
set req.http.Accept-Encoding = "deflate";
}
else {
unset req.http.Accept-Encoding;
}
}
}
sub vcl_fetch {
set beresp.grace = 24h;
unset beresp.http.pragma;
set beresp.http.Max-Age = 31557600;
set beresp.http.Cache-Control = "public, max-age=31557600";
unset beresp.http.Set-Cookie;
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
}
else {
set resp.http.X-Cache = "MISS";
}
}
所以我不明白为什么相同的配置在另一台服务器上不起作用。
更新:
按照 Carlos Abalde 的建议在调试模式下运行,我现在看到以下错误:
Message from VCC-compiler:
VCL sub's named 'vcl*' are reserved names.
('input' Line 28 Pos 5)
sub vcl_fetch {
----#########--
Valid vcl_* methods are:
none
vcl_recv
vcl_pipe
vcl_pass
vcl_hash
vcl_purge
vcl_miss
vcl_hit
vcl_deliver
vcl_synth
vcl_backend_fetch
vcl_backend_response
vcl_backend_error
vcl_init
vcl_fini
Running VCC-compiler failed, exited with 2
VCL compilation failed
我不明白为什么 vcl_fetch 无法被识别。这是我的 Varnish 版本信息:
varnishd (varnish-4.0.2 revision bfe7cd1)
Copyright (c) 2006 Verdens Gang AS
Copyright (c) 2006-2014 Varnish Software AS
答案1
如果 Varnish 没有启动,您可以尝试在前台手动运行它,然后检查标准输出中的错误:sudo varnishd -F -f /path/to/your.vcl
。
答案2
经过进一步挖掘,版本信息给了我一些线索。我在这里发现了类似的问题:
https://stackoverflow.com/questions/23284764/varnish-wont-recognize-req-grace-variable
基本上,我在 Varnish 4 安装上使用 Varnish 版本 3 配置。看来我必须重写我的 VCL。