哪个变量合成'在Varnish 4中设置?

时间:2017-09-08 02:30:54

标签: varnish varnish-vcl varnish-4

在vcl_synth中我试图修改错误页面;我可能会将此移至vcl_backend_error,但由于问题仍然存在,因此没有实际意义。我使用的是CentOS 7,因此只能访问4.0而不是4.1。这很重要,因为std.file_exists仅存在于> = 4.1中。使用不受信任,未经测试的来源打破向前/向后兼容性的软件包是不可接受的。

要处理503.html文件可能不存在的问题,我想测试合成输出,如果null / empty则生成回退错误页面。为了调试我将所有输出都抛给了syslog;这不会以目前的形式持续生产。

样品:

sub vcl_synth {
    if (resp.status == 503) {
        set resp.http.Content-Type = "text/html; charset=utf-8";
        synthetic(std.fileread("/var/www/vhost/" + req.http.host + "/error/503.html"));
        std.syslog(3, "resp.http.body: " + resp.http.body);
        return (deliver);
    }
}

通过上面我清楚地看到resp.http.body是空的,但是页面被返回并在我的浏览器中呈现。那么,如果确实如此,哪个变量合成集?并且,它可以测试吗?

# journalctl -f
...
Sep 08 02:17:17 REDACTED_HOSTNAME varnishd[32498]: resp.http.body: 

请停止

2 个答案:

答案 0 :(得分:1)

synthetic(...)期间执行vcl_synth不会填充resp.http.body。那只是一个随机的标题名称。一种可能的方法是用响应体填充“临时变量”:

sub vcl_synth {
    if (resp.status == 503) {
        set resp.http.Content-Type = "text/html; charset=utf-8";
        set req.http.X-Synth-Body = std.fileread("/var/www/vhost/" + req.http.host + "/error/503.html");
        synthetic(req.http.X-Synth-Body);
        std.syslog(3, "req.http.X-Synth-Body: " + req.http.X-Synth-Body);
        return (deliver);
    }
}

答案 1 :(得分:1)

关于:

  

使用来自不受信任的未经测试的来源的包是不可接受的   打破向前/向后兼容性。

清漆有dedicated repository for 4.1

这些包是签名的,仅针对4.1分支,不应该向前/向后兼容。

另外,既然您正在使用他们的软件,那么您基本上已经信任他们了。此外,最近的安全更新可能会使其更快地存储到存储库而不是EPEL等。

Varnish 4.0正式EOL。