博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nginx根据cookie分流
阅读量:6038 次
发布时间:2019-06-20

本文共 2403 字,大约阅读时间需要 8 分钟。

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 cookieset $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上

 

转自:http://blog.csdn.net/yanook/article/details/8275716

转载于:https://www.cnblogs.com/olmlo/p/3705980.html

你可能感兴趣的文章
Python每日一练0016
查看>>
我要做 Android 之 9.19 日面笔试总结
查看>>
Git 实用指南
查看>>
使用 webpack 构建应用
查看>>
ES6 - 箭头函数、箭头函数与普通函数的区别
查看>>
1分钟解读使用css-border制作小三角
查看>>
编写了一个辅助Flutter弹出Toast的Package
查看>>
【React】戏说组件式百度图表的由来及简单逻辑
查看>>
如何写好 C main 函数
查看>>
opencv笔记(5): 图像旋转
查看>>
多类名选择器
查看>>
sklearn 决策树
查看>>
JAVA中int、String的类型转换
查看>>
bacula初使用备份(完全备份,增量备份,和还原指定数据)
查看>>
Activity判断当前任务实例执行后的下一节点类型
查看>>
Linux如何查找大文件或目录总结
查看>>
String类型的日期加减一天
查看>>
ActiveMQ安装
查看>>
树莓派 GPS 时钟
查看>>
lucene4.2 在分页时 永远显示第一页的问题
查看>>