HAProxy配置2组后端不同sticky session头 前端if条件是否有问题
配置问题判定
你给出的frontend段if判断条件确实存在问题,具体如下:
- 问题1:直接用
req.hdr(请求头名称)作为判断条件逻辑不符合需求。req.hdr()的作用是提取请求头的取值,只有当请求头存在且取值可被判定为布尔真(非空、非0)时,条件才会成立。如果请求头存在但取值为空字符串,匹配会直接失败。如果你的需求是只要存在对应请求头就匹配后端,应该使用req.hdr_exists(请求头名称)语法做存在性判断。 - 问题2:未处理请求同时携带
my-User和X-Hash两个请求头的冲突场景。HAProxy的use_backend规则按从上到下的顺序匹配,命中第一条规则后就不会继续匹配后续规则,此时所有同时携带两个头的请求都会被路由到mybackend1,如果业务不允许这个默认优先级,需要添加互斥判断规避歧义。
修正后的参考配置
frontend application bind 0.0.0.0:80 mode http balance roundrobin # 仅携带my-User头且未携带X-Hash头时路由到mybackend1 use_backend mybackend1 if { req.hdr_exists(my-User) } !{ req.hdr_exists(X-Hash) } # 仅携带X-Hash头且未携带my-User头时路由到mybackend2 use_backend mybackend2 if { req.hdr_exists(X-Hash) } !{ req.hdr_exists(my-User) } # 按需添加默认后端,处理两个头都不存在的请求 # default_backend xxx
补充:如果你需要请求头不仅存在,还要取值非空才命中规则,可以把
req.hdr_exists替换为req.hdr(头名) -m found,两者效果基本一致。
内容的提问来源于stack exchange,提问作者PythonicWays
相关产品推荐
相关产品推荐

