我正在尝试为用户定制当他到达大师冥想错误屏幕时,在向我的后端发出错误请求时显示在屏幕上的内容,后端在前面有一个Varnish反向代理。我曾尝试将log.info(client.ip)放在default.vcl的不同子例程中,但在尝试启动varnish服务时遇到了编译错误。我使用的是Linux虚拟机。
发布于 2021-11-10 17:16:57
你当然可以。看看我创建的以下教程:https://www.varnish-software.com/developers/tutorials/vcl-synthetic-output-template-file/。
修改合成输出模板
下面是在从VCL代码调用vcl_synth时扩展常规return(synth())子例程所需的VCL代码,以及在发生后端获取错误时扩展vcl_backend_response所需的代码:
vcl 4.1;
import std;
sub vcl_synth {
set resp.http.Content-Type = "text/html; charset=utf-8";
set resp.http.Retry-After = "5";
set resp.body = regsuball(std.fileread("/etc/varnish/synth.html"),"<<REASON>>",resp.reason);
return (deliver);
}
sub vcl_backend_error {
set beresp.http.Content-Type = "text/html; charset=utf-8";
set beresp.http.Retry-After = "5";
set beresp.body = regsuball(std.fileread("/etc/varnish/synth.html"),"<<REASON>>",beresp.reason);
return (deliver);
}正如本教程中所解释的,您可以存储要在HTML中显示的HTML代码,并将其加载到VCL输出中。
诀窍是在HTML中放置一个<<REASON>>占位符,在其中解析实际的错误消息。
向VCL添加自定义日志记录
如果想要添加发送到VSL的自定义日志记录,可以使用vmod_std中的std.log()函数。
下面是一些使用此函数的示例VCL代码:
vcl 4.1;
import std;
sub vcl_recv {
std.log("Client IP: " + client.ip);
}日志将通过VCL_Log标签显示在您的VSL输出中。
如果要过滤掉VCL_Log标签,可以使用以下命令:
varnishlog -g request -i VCL_Log这是您可能收到的输出:
* << Request >> 32770
- VCL_Log Client IP: 127.0.0.1
** << BeReq >> 32771如果你没有过滤VCL_Log标签,如果你运行varnishlog -g request,你会看到它出现在你的VSL输出中。
提示:如果只想查看特定URL的完整日志事务,只需运行
varnishlog -g request -q "ReqUrl eq '/'"即可。这将仅显示主页的日志。
更新:在合成输出中显示客户端IP
下面的VCL代码通过连接到原因短语将X-Forwarded-For头注入到输出中:
vcl 4.1;
import std;
sub vcl_synth {
set resp.http.Content-Type = "text/html; charset=utf-8";
set resp.http.Retry-After = "5";
set resp.body = regsuball(std.fileread("/etc/varnish/synth.html"),"<<REASON>>",resp.reason + " (" + req.http.X-Forwarded-For + ")");
return (deliver);
}
sub vcl_backend_error {
set beresp.http.Content-Type = "text/html; charset=utf-8";
set beresp.http.Retry-After = "5";
set beresp.body = regsuball(std.fileread("/etc/varnish/synth.html"),"<<REASON>>",beresp.reason + " (" + bereq.http.X-Forwarded-For + ")");
return (deliver);
}还可以在模板中提供第二个占位符,并执行额外的
regsuball()调用。但为了简单起见,只将X-Forwarded-For头附加到reason字符串。
https://stackoverflow.com/questions/69917341
复制相似问题