首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当通过我的Varnish服务器发出请求时,我如何定制显示给Guru冥想错误的用户的消息?

当通过我的Varnish服务器发出请求时,我如何定制显示给Guru冥想错误的用户的消息?
EN

Stack Overflow用户
提问于 2021-11-10 17:02:42
回答 1查看 41关注 0票数 0

我正在尝试为用户定制当他到达大师冥想错误屏幕时,在向我的后端发出错误请求时显示在屏幕上的内容,后端在前面有一个Varnish反向代理。我曾尝试将log.info(client.ip)放在default.vcl的不同子例程中,但在尝试启动varnish服务时遇到了编译错误。我使用的是Linux虚拟机。

EN

回答 1

Stack Overflow用户

发布于 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所需的代码:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
vcl 4.1;

import std;

sub vcl_recv {
    std.log("Client IP: " + client.ip);
}

日志将通过VCL_Log标签显示在您的VSL输出中。

如果要过滤掉VCL_Log标签,可以使用以下命令:

代码语言:javascript
复制
varnishlog -g request -i VCL_Log

这是您可能收到的输出:

代码语言:javascript
复制
*   << 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头注入到输出中:

代码语言:javascript
复制
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字符串。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69917341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档