nginx 根据IP进行灰度发布

灰度发布,简单来说,就是根据各种条件,让一部分用户使用旧版本,另一部分用户使用新版本。

nginx 的语法本身可以看作是一门小型的编程语言,通过简单的编程,可以轻松实现基于IP的灰度发布。

需求:搭建准生产环境,供开发人员/运维在线上做最后的调整。如果OK,直接用rsync推送至生产环境。

条件:办公室网络出口有固定IP

解决办法:

nginx 负载均衡器判断客户端IP地址,

如果是办公室IP,则反向代理到准生产环境;

如果不是,则反向代理到生产环境。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
upstream prod {
    server 192.168.1.10;
    server 192.168.1.11;
}
upstream pre-prod {
    server 192.168.1.100;
}
server {
    listen 80;
    access_log /var/log/nginx/access.log main;
    set $web_backend prod;
    if ($remote_addr ~ "123.123.123.123") {
        set $web_backend pre-prod;
    }
    location / {
        proxy_pass http://$web_backend;
        include proxy.conf;
    }
}

同理,也可以根据不同的IP,设置不同的网站根目录,达到相同的目的。

1
2
3
4
5
6
7
8
9
10
11
server {
    listen 80;
    access_log /var/log/nginx/access.log main;
    set $rootdir "/var/www/html";
    if ($remote_addr ~ "123.123.123.123") {
        set $rootdir "/var/www/test";
    }
    location / {
        root $rootdir;
    }
}

同理,还可以利用geoip做基于地理位置的灰度发布,不详细介绍。

nginx 根据IP进行灰度发布》有1个想法

  1. fredzeng

    根据Cookie实现灰度发布
    根据Cookie查询version值,如果该version值为v1转发到host1,为v2转发到host2,都不匹配的情况下转发默认。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    upstream host1 {
    server 192.168.2.46:2001 weight=1; #轮询服务器和访问权重
    server 192.168.2.46:2002 weight=2;
    }
    upstream host2 {
    server 192.168.1.155:1111 max_fails=1 fail_timeout=60;
    }
    upstream default {
    server 192.168.1.153:1111 max_fails=1 fail_timeout=60;
    }
    map $COOKIE_version $group {
    ~*v1$ host1;
    ~*v2$ host2;
    default default;
    }
    lua_shared_dict ip_blacklist 1m;
    server {
    listen 80;
    #set $group “default”;
    #if ($http_cookie ~* “version=v1”){
    # set $group host1;
    #}
    #if ($http_cookie ~* “version=v2”){
    # set $group host2;
    #}
    location / {
    access_by_lua_file lua/ip_blacklist.lua;
    proxy_pass http://$group;
    }
    }

评论已关闭。