IT序号网

nginx根据cookie分流

developer 2021年05月25日 程序员 244 0

nginx根据cookie分流
众所周知,nginx可以根据url path进行分流,殊不知对于cookie分流也很强大,同时这也是我上篇提到的小流量实验的基础。

二话不说,先看需求,两台服务器分别定义为
apache001:192.168.1.1:8080
apache002:192.168.1.2:8080

默认服务器为:
default:192.168.1.0:8080

前端nginx服务器监听端口8080,需要根据cookie转发,查询的cookie的键(key)为abcdexpid,如果该cookie值(value)以1结尾则转发到apache001,以2结尾则转发到apache002。

方案1:
用map,nginx.conf配置如下:

map $COOKIE_abcdexpid $group { 
~*1$ apache001; 
~*2$ apache002; 
default root; 
} 
 
upstream apache001 { 
server 192.168.1.1:8080 weight=1 max_fails=1 fail_timeout=30s; 
} 
 
upstream apache002 { 
server 192.168.1.2:8080 weight=1 max_fails=1 fail_timeout=30s; 
} 
 
upstream root { 
server 192.168.1.0:8080 weight=1 max_fails=1 fail_timeout=30s; 
} 
 
server { 
listen 8080; 
server_name neoremind.net; 
 
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 
'$status $body_bytes_sent "$http_referer" "group=$group"' 
'"$http_user_agent" $gzip_ratio $request_time "$http_x_forwarded_for"'; 
 
access_log logs/access_log main; 
error_log logs/error_log; 
 
location / { 
proxy_pass http://$group; 
proxy_set_header X-Forwarded-For $remote_addr; 
}  
}



方案2:
利用set和if…else… ,nginx.conf配置如下:

upstream apache001 { 
server 192.168.1.1:8080 weight=1 max_fails=1 fail_timeout=30s; 
} 
 
upstream apache002 { 
server 192.168.1.2:8080 weight=1 max_fails=1 fail_timeout=30s; 
} 
 
upstream root { 
server 192.168.1.0:8080 weight=1 max_fails=1 fail_timeout=30s; 
} 
 
server { 
listen 8080; 
server_name beidoutest.baidu.com; 
 
#match cookie 
set $group "root"; 
if ($http_cookie ~* "abcdexpid=([^;]+)(1$)"){ 
set $group apache001; 
} 
if ($http_cookie ~* "abcdexpid=([^;]+)(2$)"){ 
set $group apache002; 
} 
 
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 
'$status $body_bytes_sent "$http_referer" "group=$group"' 
'"$http_user_agent" $gzip_ratio $request_time "$http_x_forwarded_for"'; 
 
access_log logs/access_log main; 
error_log logs/error_log; 
 
location / { 
proxy_pass http://$group; 
proxy_set_header X-Forwarded-For $remote_addr; 
} 
 
} 
 
  
 
map $COOKIE_id $group {  
700003508 admin;  
~*3$ admin;  
default user;  
}  
 
upstream backend_user {  
server 10.3.24.11:8080;  
}  
 
upstream backend_admin {  
server 10.3.25.21:8081;  
}  
 
server {  
listen 80;  
server_name photo.domain.com;  
 
location / {  
proxy_pass http://backend_$group;  
}  
} 


首先,是在nginx里面配置一个映射,$COOKIE_id可以解析出cookie里面的id字段,$group是一个变量,{}里面是映射规则,

这样,如果一个id为700003508的人来访问,$group就等于admin。

然后在server里面使用就会代理到http://backend_admin上


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

nginx之allow、deny