You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Varnish配置需求:将登录用户流量转发至远程服务器

Varnish 按登录状态分流请求配置方案

你之前的配置误区在于:请求级别的分流逻辑不能放在vcl_init中,vcl_init仅在Varnish启动/重载配置时执行一次,用于初始化后端、调度器等全局资源,无法处理每个请求的动态判断(比如识别登录状态)。正确的分流逻辑应该放在vcl_recv中,通过判断请求Cookie来动态选择后端。

以下是符合需求的完整配置:

# 定义远程后端(登录用户流量转发目标)
backend web1 {
    .host = "1.1.1.1";
    .port = "80";
    .probe = {
        .url = "/";
        .timeout = 1s;
        .interval = 5s;
        .window = 5;
        .threshold = 3;
    }
}

# 定义本地Nginx后端(未登录用户流量目标)
backend web2 {
    .host = "127.0.0.1";
    .port = "8080";
    .probe = {
        .url = "/";
        .timeout = 1s;
        .interval = 5s;
        .window = 5;
        .threshold = 3;
    }
}

sub vcl_recv {
    # 判断请求Cookie中是否存在登录标识(替换为你实际的SESSION_COOKIE名称)
    if (req.http.Cookie ~ "SESSION_COOKIE=") {
        # 登录用户,转发至远程服务器web1
        set req.backend_hint = web1;
    } else {
        # 未登录用户,转发至本地Nginx服务器web2
        set req.backend_hint = web2;
    }

    # 可选:如果需要排除某些静态资源分流,可添加额外判断
    # 比如所有静态文件直接走本地:
    # if (req.url ~ "^/(images|css|js)/") {
    #     set req.backend_hint = web2;
    # }
}

配置说明:

  • 移除了多余的round_robin调度器,因为我们不需要轮询,而是基于登录状态的条件分流。
  • 在vcl_recv中通过正则匹配req.http.Cookie,识别是否包含登录会话Cookie(请确保替换为你系统中实际使用的会话Cookie名称)。
  • 后端健康探测配置保留了你原有的设置,确保Varnish能自动检测后端可用性。

注意事项:

  • 如果你的登录Cookie有特定的前缀或格式,请调整正则表达式,比如"^SESSION_COOKIE=[^;]+"可以更精准匹配完整的Cookie项。
  • 若存在其他需要强制分流的场景(如后台管理路径),可在vcl_recv中添加额外的if判断规则。

内容的提问来源于stack exchange,提问作者Ubuntubasic1864

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 02:45:07