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;
	}
 
}
 

Leave a Comment.