Nginx在做http代理转发的角色时,我们可能有需要针对不同用户请求的header,分布到不同的上游upstream服务器组。这里使用Cookie对用户进行分类,然后配置Nginx实现上游服务器的分发。
业务场景:
一、 根据用户所在城市分发,这里使用了map模块对匹配内容进行分发
1. upstream模块配置:
upstream sh {
server sh.domain.com;
}
upstream nj {
server nj.domain.com;
}
upstream web {
server web.domain.com;
}
2. map模块配置:
map $cookie_user_city $upst {
default web;
~sh sh;
~nj nj;
}
3. server模块配置:
server {
listen 80;
server_name www.domain.com;
location / {
proxy_pass http://$upst;
}
}
4. 访问测试:
curl -i -b ‘user_city=sh‘ http://www.domain.com
二、根据用户请求ip进行分发,这里使用了geo模块对匹配内容进行分发
1. upstream模块配置:
upstream test {
server test.domain.com;
}
upstream nj_test {
server nj.test.domain.com;
}
upstream sh_pro {
server sh.domain.com;
}
2. geo模块配置
geo $remote_addr $ip_list {
192.168.0.0/24 test;
10.0.0.0/8 test;
172.16.0.0/16 test;
211.156.181.25 nj_test;
}
3. server模块配置:
server {
listen 80;
server_name www.domain.com;
location / {
if ($ip_list = ‘test‘){
proxy_pass http://test;
}
if ($ip_list = ‘nj_test‘){
proxy_pass http://nj_test;
}
proxy_pass http://sh_pro;
}
}
这里来简单介绍一下map模块和geo模块。
map模块是由ngx_http_map_module提供的,默认安装,除非使用--without-http_map_module指令。map模块可以创建变量进行关联,可以整合多个不同的值到map模块是由ngx_http_map_module提供的,默认安装,除非使用--without-http_map_module指令。map模块可以创建变量进行关联,可以整合多个不同的值到一个或多个相同的值并存储到变量当中,它维护的是一个映射关系。
geo模块是由ngx_http_geo_module提供的,默认安装,除非使用--without-http_geo_module。它是专门用来对IP进行分类的,可以将多个来源IP进行分组,用以实现让不同来源的IP访问不同的上游服务器。注意,geo模块非geoip模块。