实现需求:根据cookie里的device-id值的尾数来将请求转发到不同的设备上
尾数的范围:0-9,A-F
将尾数为0-7的请求转发到server1上,将位数为89ABCDEF的请求分发到server2上
map $cookie_device-id $backend {
~^[1234567]$ backend1;
default backend2;
}
upstream backend1 {
server server1 weight=1 max_fails=5 fail_timeout=30s;
}
upstream backend2 {
server server2 weight=1 max_fails=5 fail_timeout=30s;
}
location / {
proxy_pass http://$backend;
}
上述有问题可以使用下面;
upstream backend1 {
server server1 weight=1 max_fails=5 fail_timeout=30s;
}
upstream backend2 {
server server2 weight=1 max_fails=5 fail_timeout=30s;
}
location / {
set $device_id 0;
if ($http_cookie ~* "device-id=([^;]+)(?:; )?") {
set $device_id $1;
}
if ($device_id ~ "(A|B|C|D|E|F)$" ) {
proxy_pass http://backend1;
}
proxy_pass http://backend2;
手动设置随机数
location / {
if ($cookie_device-id = '') {
# 如果随机值不存在时,设置随机值
set_by_lua_block $device_id {
-- 设置随机数种子
math.randomseed(os.time())
-- 生成0到9之间的随机整数
local random_number = math.random(0, 9)
return random_number
# 设置随机值
add_header Set-Cookie "device-id=$device_id; Max-Age=86400; Path=/; HttpOnly";
}
#如果随机值为指定的数字时,访问灰度环境(不需要灰度环境时,注释即可)
if ($cookie_device-id = '14') {
proxy_pass http://123_com_grayscale;
}
include /usr/local/nginx/conf/proxy_setother.conf;
proxy_pass http://123_com;
}