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上

  • 相关阅读:
    认识Backbone (二)
    认识Backbone (一)
    认识Underscore
    了解HTML5和“她”的 API (三)
    了解HTML5和“她”的 API (二)
    了解HTML5和“她”的 API (一)
    javascript中的“向量”
    使用HTML5 Canvas做些什么
    IE6浏览器的一些问题
    javascript动画中的“帧”
  • 原文地址:https://www.cnblogs.com/cheyunhua/p/10272439.html
Copyright © 2011-2022 走看看