在清漆缓存服务器上,我想将所有登录流量发送到远程服务器,同时将未登录用户保留在同一台清漆服务器中。 目前,我有 nginx Web 服务器与 varnish 一起运行。 80端口给Varnish开放,8080给nginx。
我尝试过类似下面的方法,只是为了分割流量。
`backend web1 {
.host = "1.1.1.1";
.port = "80";
.probe = {
.url = "/";
.timeout = 1s;
.interval = 5s;
.window = 5;
.threshold = 3;
}
}
backend web2 {
.host = "127.0.0.1";
.port = "8080";
.probe = {
.url = "/";
.timeout = 1s;
.interval = 5s;
.window = 5;
.threshold = 3;
}
}`
sub vcl_init {
new balancer = directors.round_robin();
balancer.add_backend(web1);
balancer.add_backend(web2);
}
sub vcl_recv {
set req.backend_hint = balancer.backend();
}`
Web1是通过DHCP给远程连接的服务器提供流量,web2是为运行同一服务器的nginx服务器。
this link
给出的建议。
所以, if(req.http.Cookie) for 'SESSION_COOKIE',但我认为,就我的情况而言,这应该转到 sub vcl_init,而不是 sub vcl_recv。 (当然不是 round_robin)
从这一点上来说,我不知道如何设置。
虽然您可以随意使用
vmod_directors
进行负载平衡,但您并不真正需要它。您还可以在 VCL 中显式分配后端。
这是我根据您的示例代码编写的用于解决该问题的 VCL 代码:
vcl 4.1;
import cookie;
backend web1 {
.host = "1.1.1.1";
.port = "80";
.probe = {
.url = "/";
.timeout = 1s;
.interval = 5s;
.window = 5;
.threshold = 3;
}
}
backend web2 {
.host = "127.0.0.1";
.port = "8080";
.probe = {
.url = "/";
.timeout = 1s;
.interval = 5s;
.window = 5;
.threshold = 3;
}
}
sub vcl_recv {
cookie.parse(req.http.Cookie);
if(req.http.Authorization || cookie.isset("SESSION_COOKIE")) {
set req.backend_hint = web1;
} else {
set req.backend_hint = web2;
}
}
我的假设是登录用户要么使用
Authorization
标头或使用 SESSION_COOKIE
cookie 对自己进行授权。
我正在使用
vmod_cookie
轻松访问 cookie 值。如果您使用的是(相对)最新版本的 Varnish,则应该可以使用此 VMOD。
如果
Authorization
标头是请求的一部分或者存在 SESSION_COOKIE
cookie,我们会将流量发送到 web1
后端,否则我们将流量发送到 web2
后端。
当然你可能需要稍微修改一下代码,但你明白了,对吧?