zoukankan      html  css  js  c++  java
  • nginx根据cookie分流

    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上

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

  • 相关阅读:
    文件的权限与隐藏属性
    Linux工具之bc计算器进制的转换
    老司机教你在windows不用软件隐藏重要文件
    LInux基础命令分类
    Linux文本的处理
    文件的默认权限UMASK
    H3C虚拟化之IRF
    H3C单臂路由配置
    H3C路由交换常用命令
    H3C交换机802.1&dot1x认证
  • 原文地址:https://www.cnblogs.com/olmlo/p/3705980.html
Copyright © 2011-2022 走看看