Varnishtest(Varnish 5.1.3):TRACE测试中第二服务器响应未生效咨询
排查Varnishtest中TRACE请求测试的第二服务器响应未使用问题
先拆解你的测试脚本里的核心问题,这应该是导致后端s1的第二个响应没被正常触发/使用的关键原因:
1. Client侧第二个请求的方法缺失,导致流转逻辑不符合预期
你的客户端脚本里第二个请求是:
txreq -url "/2"
这个命令没有指定请求方法,Varnishtest默认会发送GET请求。而你的VCL规则里只拦截TRACE方法返回405,所以这个GET请求会被Varnish转发到后端s1,但如果你的预期是第二个请求也触发Varnish的405拦截,那你漏加了-req TRACE参数。
2. Server侧的请求匹配逻辑与实际请求不匹配
你的s1服务器脚本里,第二个rxreq只验证了req.url == "/2",但没有限定请求方法。如果客户端发的是GET请求,虽然能匹配到,但如果你的测试预期是第二个请求不会到达后端(应该被Varnish拦截),那s1的第二个rxreq会一直等待请求,导致测试超时,看起来就像是s1的响应没被使用。
针对性修复方案
方案一:测试两个TRACE请求都被Varnish拦截
如果你的测试目标是验证所有TRACE请求都返回405,修改客户端脚本,给第二个请求加上TRACE方法:
client c1 { txreq -req TRACE -url "/1" rxresp expect resp.status == 405 expect resp.reason == "Method Not Allowed" # 第二个请求明确指定TRACE方法 txreq -req TRACE -url "/2" rxresp expect resp.status == 405 expect resp.reason == "Method Not Allowed" }
同时要删除s1里的第二个rxreq和txresp,因为这两个TRACE请求都不会到达后端。
方案二:测试非TRACE请求正常转发到后端
如果你的测试目标是验证非TRACE请求能正常到达后端,保留客户端的GET请求,补全响应验证,并完善s1的匹配逻辑:
server s1 { rxreq expect req.method == "TRACE" expect req.url == "/1" txresp rxreq expect req.method == "GET" # 明确验证请求方法 expect req.url == "/2" txresp -status 200 # 明确返回状态码 } # ... 中间VCL部分不变 ... client c1 { txreq -req TRACE -url "/1" rxresp expect resp.status == 405 expect resp.reason == "Method Not Allowed" txreq -url "/2" # 默认GET请求 rxresp expect resp.status == 200 # 验证后端返回的状态码 expect resp.http.x-forwarded-for == "127.0.0.1" # 验证vcl_deliver添加的响应头 }
额外调试技巧
可以用varnishtest -d命令启用调试模式,它会输出每个请求的完整流转过程(客户端→Varnish→后端→Varnish→客户端),能帮你快速定位请求到底卡在了哪个环节。
内容的提问来源于stack exchange,提问作者Alex Vest
相关产品推荐
相关产品推荐

