Varnish 将用户登录到远程服务器

问题描述 投票:0回答:1

在清漆缓存服务器上,我想将所有登录流量发送到远程服务器,同时将未登录用户保留在同一台清漆服务器中。 目前,我有 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)

从这一点上来说,我不知道如何设置。

varnish varnish-vcl
1个回答
0
投票

虽然您可以随意使用

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
后端。

当然你可能需要稍微修改一下代码,但你明白了,对吧?

© www.soinside.com 2019 - 2024. All rights reserved.