自定义VCL防止清漆开始

操作系统: CentOS 6(x86_64)

我已经安装并configuration了清漆,但现在无法启动。

# service varnish restart Stopping Varnish Cache: [FAILED] Starting Varnish Cache: [FAILED] 

我将这个错误缩小到/etc/varnish/default.vcl的另一个VCL文件。

我包括VCL像这样:

 include "/etc/varnish/domains/playwithbits.vcl"; 

如果我清空playwithbits.vcl的内容,然后清漆能够开始,但只要我添加内容失败。

我的playwithbits.vcl的内容是:

 backend playwithbits { .host = "localhost"; .port = "8080"; } acl purge { if (req.http.Host ~ "playwithbits.com") { "localhost"; } } sub vcl_recv { if (req.http.Host ~ "playwithbits.com") { set req.backend = playwithbits; if (req.request == "PURGE") { if (!client.ip ~ purge) { error 405 "Not allowed."; } return(lookup); } if (req.url ~ "^/$") { unset req.http.cookie; } } } sub vcl_hit { if (req.http.Host ~ "playwithbits.com") { if (req.request == "PURGE") { set obj.ttl = 0s; error 200 "Purged."; } } } sub vcl_miss { if (req.http.Host ~ "playwithbits.com") { if (req.request == "PURGE") { error 404 "Not in cache."; } if (!(req.url ~ "wp-(login|admin)")) { unset req.http.cookie; } if (req.url ~ "^/[^?]+.(jpeg|jpg|png|gif|ico|js|css|txt|gz|zip|lzma|bz2|tgz|tbz|html|htm)(\?.|)$") { unset req.http.cookie; set req.url = regsub(req.url, "\?.$", ""); } if (req.url ~ "^/$") { unset req.http.cookie; } } } sub vcl_fetch { if (req.http.Host ~ "playwithbits.com") { if (req.url ~ "^/$") { unset beresp.http.set-cookie; } if (!(req.url ~ "wp-(login|admin)")) { unset beresp.http.set-cookie; } } } 

这是# strace -e trace=file service varnish start

 execve("/sbin/service", ["service", "varnish", "start"], [/* 20 vars */]) = 0 access("/etc/ld.so.preload", R_OK) = 0 open("/etc/ld.so.preload", O_RDONLY) = 3 open("/etc/ld.so.cache", O_RDONLY) = 3 open("/lib64/libtinfo.so.5", O_RDONLY) = 3 open("/lib64/libdl.so.2", O_RDONLY) = 3 open("/lib64/libc.so.6", O_RDONLY) = 3 open("/dev/tty", O_RDWR|O_NONBLOCK) = 3 open("/usr/lib/locale/locale-archive", O_RDONLY) = 3 open("/proc/meminfo", O_RDONLY) = 3 stat("/etc/varnish", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 stat(".", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 open("/usr/lib64/gconv/gconv-modules.cache", O_RDONLY) = 3 open("/sbin/service", O_RDONLY) = 3 open("/etc/init.d/functions", O_RDONLY) = 3 --- SIGCHLD (Child exited) @ 0 (0) --- stat("/etc/sysconfig/i18n", {st_mode=S_IFREG|0644, st_size=47, ...}) = 0 open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3 open("/etc/profile.d/lang.sh", O_RDONLY) = 3 stat("/root/.i18n", 0x7fff831f79e0) = -1 ENOENT (No such file or directory) stat("/etc/sysconfig/init", {st_mode=S_IFREG|0644, st_size=1153, ...}) = 0 open("/etc/sysconfig/init", O_RDONLY) = 3 open("/usr/share/locale/locale.alias", O_RDONLY) = 3 open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/initscripts.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en_US.utf8/LC_MESSAGES/initscripts.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en_US/LC_MESSAGES/initscripts.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en.UTF-8/LC_MESSAGES/initscripts.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en.utf8/LC_MESSAGES/initscripts.mo", O_RDONLY) = -1 ENOENT (No such file or directory) open("/usr/share/locale/en/LC_MESSAGES/initscripts.mo", O_RDONLY) = -1 ENOENT (No such file or directory) --- SIGCHLD (Child exited) @ 0 (0) --- --- SIGCHLD (Child exited) @ 0 (0) --- chdir("/") = 0 stat("/etc/init.d/varnish", {st_mode=S_IFREG|0755, st_size=2837, ...}) = 0 stat(".", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 stat("/sbin/env", 0x7fff831f8960) = -1 ENOENT (No such file or directory) stat("/usr/sbin/env", 0x7fff831f8960) = -1 ENOENT (No such file or directory) stat("/bin/env", {st_mode=S_IFREG|0755, st_size=23832, ...}) = 0 stat("/bin/env", {st_mode=S_IFREG|0755, st_size=23832, ...}) = 0 access("/bin/env", X_OK) = 0 stat("/bin/env", {st_mode=S_IFREG|0755, st_size=23832, ...}) = 0 access("/bin/env", R_OK) = 0 stat("/bin/env", {st_mode=S_IFREG|0755, st_size=23832, ...}) = 0 stat("/bin/env", {st_mode=S_IFREG|0755, st_size=23832, ...}) = 0 access("/bin/env", X_OK) = 0 stat("/bin/env", {st_mode=S_IFREG|0755, st_size=23832, ...}) = 0 access("/bin/env", R_OK) = 0 Starting Varnish Cache: [FAILED] --- SIGCHLD (Child exited) @ 0 (0) --- 

有谁知道这个问题是什么?

解:

问题在于下面的块:

 acl purge { if (req.http.Host ~ "playwithbits.com") { "localhost"; } } 

acl purge只能以string作为值,所以if是无效的。 replace为:

 acl purge { "localhost"; } 

它就像一个魅力。

用一个好的configuration( default.vcl ?)开始清漆,然后在加载之前尝试在你的VCL上运行一个语法检查。 清漆v2.1(假设在3.x类似):

 $ varnishadm -T 127.0.0.1:6082 vcl.load error <path_to_your_vcl>