Nginx灰度发布

10.0.0.10 Nginx
10.0.0.11 service1
10.0.0.12 service2

1:使用Cookie实现灰度

根据Cookie查询Cookie键为version的值,如果该Cookie值为v1则转发到service1,为v2则转发到service2。Cookie值都不匹配的情况下默认走service1所对应的服务器

    upstream service1 {
        server 10.0.0.11:80 max_fails=1 fail_timeout=60;
    }
    upstream service2 {
        server 10.0.0.12:80 max_fails=1 fail_timeout=60;
    }
    upstream default {
        server 10.0.0.11:80 max_fails=1 fail_timeout=60;
    }

    server {
        listen 80;
        server_name www.kubernetes-devops.cn;
        
        access_log  /var/log/nginx/kubernetes-devops_cn.log    main;
        
        set $group "default";
          if ($http_cookie ~* "version=v1"){
              set $group service1;
          }
          if ($http_cookie ~* "version=v2"){
              set $group service2;
          }
        location / {
            proxy_pass http://$group;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            index index.html index.htm;
        }
    }
# 测试如下
[root@virtual_host ~]# curl 127.0.0.1 --cookie "version=v1"
v1
[root@virtual_host ~]# curl 127.0.0.1 --cookie "version=v2"
v2

2:使用map匹配cookie实现灰度发布

用map指令实现:
# 在Nginx里面配置一个映射,COOKIE_version可以解析出version字段,group是一个变量,{}里面是映射规则

如果一个version为v1的用户来访问,
group就等于service1,在server里面使用就会代理到 http://service1
如果一个version为v2的用户来访问,
group就等于service2,在server里面使用就会代理到 http://service2
Cookie值都不匹配的情况下默认走service1所对应的服务器

# 配置如下
    upstream service1 {
        server 10.0.0.11:80 max_fails=1 fail_timeout=60;
    }

    upstream service2 {
        server 10.0.0.12:80 max_fails=1 fail_timeout=60;
    }

    upstream default {
        server 10.0.0.11:80 max_fails=1 fail_timeout=60;
    }
    
    map $COOKIE_version $group {
        ~*v1$ service1;
        ~*v2$ service2;
        default default;
    }

    server {
        listen 80;
        server_name www.kubernetes-devops.cn;
        access_log  /var/log/nginx/www.kubernetes-devops_log main;
        
        location / {
            proxy_pass http://$group;      
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            index  index.html index.htm;
        }
    }

# 测试
[root@virtual_host ~]# curl www.kubernetes-devops.cn --cookie "version=v1"
v1
[root@virtual_host ~]# curl www.kubernetes-devops.cn --cookie "version=v2"
v2

3:根据来源IP实现灰度发布

# 如果是本机,则反向代理到service2;如果不是则反向代理到service1。
# 如果你只有单台服务器,可以根据不同的IP设置不同的网站根目录来达到相同的目的
[root@virtual_host ~]# cat /etc/nginx/nginx.conf
---
    upstream service1 {
        server 10.0.0.11:80 max_fails=1 fail_timeout=60;
    }

    upstream service2 {
        server 10.0.0.12:80 max_fails=1 fail_timeout=60;
    }

    upstream default {
        server 10.0.0.11:80 max_fails=1 fail_timeout=60;
    }
    
    server {
        listen 80;
        server_name www.kubernetes-devops.cn;
        access_log  /var/log/nginx/www.kubernetes-devops_log main;

        set $group default;
        if ($remote_addr ~ "10.0.0.10") {
            set $group service2;
        }

        location / {
            proxy_pass http://$group;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            index  index.html index.htm;
        }
    }

# 如果你只有单台服务器,可以根据不同的IP设置不同的网站根目录来达到相同的目的

server {
    listen 80;
    server_name  www.kubernetes-devops.cn;
    access_log  /var/log/nginx/www.kubernetes-devops_log main;

    set $rootdir "/var/www/html";
      if ($remote_addr ~ "10.0.0.10") {
         set $rootdir "/var/www/v2";
      }

      location / {
        root $rootdir;
      }
  }
  
  
# 测试
[root@nginx ~]# curl www.kubernetes-devops.cn
v2
# 去另一个主机操作访问
[root@web1 ~]# curl www.kubernetes-devops.cn
v1


# 到此最基本的实现灰度发布方法就讲解完了,如果要做更细粒度灰度发布可参考ABTestingGateway项目
posted @ 2022-06-13 18:38  Layzer  阅读(172)  评论(0编辑  收藏  举报