您的位置:首页 > 运维架构 > Nginx

nginx根据cookie分流

2014-02-13 17:55 561 查看
众所周知,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;
}
 
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: