我正在使用 HAProxy 对一组 PHP 服务器进行负载平衡,现在想在场景中引入 Varnish。
当且仅当 app-login cookie 不可用时,HAP 才会向 Varnish 发送请求,Varnish 无需在此执行任何操作,只需处理请求(Cache HIT)或在 Cache MISS 的情况下将其发送回 HAP,然后 HAP 会选择一台 PHP 服务器,并从中获取资源,并通过 Varnish 由 HAP 提供给客户端。我有以下配置文件。
我不明白这里有 2 件事;
- 在缓存未命中的情况下,Varnish 将请求返回给 HAP,HAP 会检查应用程序登录 cookie,如果找不到则将其发送回 varnish(无尽循环的情况),我可以让 Varnish 设置一个 cookie 并让 HAP 检查该 cookie,并在此基础上选择 PHP 服务器后端(欢迎提出建议)。
- 其次,如何实现当 HAP 获取资源时,如果出现 MISS,则将其发送给 Varnish,然后提供给客户端,这样 Varnish 最终就能建立缓存。
如果这里遗漏了一些关键内容,请告诉我。
提前致谢
配置文件
#BE for Varnish is HAP in this machine
backend default {
.host = "127.0.0.1";
.port = "80";
}
sub vcl_recv {
# HAP sends request to Varnish iff app-login cookie is not available
# Varnish doesnt have to do anything here except to serve request(Cache HIT) or
# send it back to HAP incase of Cache MISS, resouces are then fetched from PHP servers
# and served to client by HAP through Varnish
# We unset the cookies here as they dont affect the response
unset req.http.cookie;
# Lighttpd is already compressing resources, so we dont do it here.
return (lookup); # Control is passed to vcl_hit or vcl_miss
}
sub vcl_hit {
return (deliver);
}
sub vcl_miss {
return (fetch);
}
sub vcl_fetch {
set obj.ttl = 1m;
return (deliver);
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
} else {
set resp.http.X-Cache = "MISS";
}
return (deliver);
}
sub vcl_init {
return (ok);
}
sub vcl_fini {
return (ok);
}
答案1
感谢 Baptiste Assmann,我能够获得我所问的第 2 点的答复 - 一旦 PHP 服务器回答 HAProxy,响应就会遵循反向路径,因此响应会通过 Varnish(因此会被缓存),然后传回 HAProxy,再传回客户端。
对于第 1 点,我提到的循环条件(再次感谢 Baptiste)可以通过在 HAP 配置中放置 ACL 来修复,该 ACL 将流量路由到 PHP 服务器(我使用 Varnish 的 IP 作为条件),因此当发生缓存未命中时,HAP 会从 Varnish 接收请求,获取资源并遵循相反的路径,然后转到 Varnish,再转到 HAP,最后到用户。我测试了这种情况,HAP 日志清楚地表明它正在运行:
108.108.108.108:21478 [08/Jan/2013:11:58:16.**637**] inbound varnish/varnish0 1/0/0/1803/2182 200 45872 – - —- 2/2/0/1/0 0/0 {abc.xxx.com} “GET / HTTP/1.1″
192.168.1.1:37029 [08/Jan/2013:11:58:16.**639**] inbound worker/worker0 0/0/0/1796/1802 200 45776 – - –NI 2/2/0/1/0 0/0 {abc.xxx..com} “GET / HTTP/1.1″
调用到达 HAP,由于 cookie 不可用,HAP 将其发送到 varnish,发生缓存未命中,HAP 使用 worker0 获取资源。在下一次调用中(我缓存了 1 分钟),Varnish 从缓存中提供所有内容(varnishlog 告诉我这一点),并且未联系 PHP 服务器。
谢谢