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
相关产品推荐
相关产品推荐

