• 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上

  • 相关阅读:
    Java基础学习篇---------static
    Java基础学习篇---------this、object的学习
    Java基础学习篇---------String、集合的学习
    Java基础学习篇---------多态
    Java基础学习篇---------继承
    Java基础学习篇---------封装
    Java基础学习篇---------多线程
    Handler主线程和子线程相通信
    Handler的使用
    c# DataGridView操作
  • 原文地址:https://www.cnblogs.com/cheyunhua/p/10272439.html
Copyright © 2020-2023  润新知