利用nginx實現生產和灰度環境流量切換

一、根據cookie實現灰度配置

查詢cookie鍵爲version的值,若是該cookie值爲V1則轉發到server_01,爲V2則轉發到server_02,cookie值都不匹配的狀況下默認走server_01所對應的服務器。html

(1)、使用if指令實現

upstream server_01 {
    server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
}
upstream server_02 {
    server 192.168.1.101:8080 max_fails=1 fail_timeout=60;
}
server {
    listen 80;
    server_name www.server.com;

    #match cookie
    set $server "server_01";
    if ($http_cookie ~* "version=V1"){
        set $server server_01;
    }
    if ($http_cookie ~* "version=V2"){
        set $server server_02;
    }
    location / {
        proxy_pass http://$server;
        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;
    }
}

(2)、使用map指令實現

upstream server_01 {
    server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
}
upstream server_02 {
    server 192.168.1.101:8080 max_fails=1 fail_timeout=60;
}
map $COOKIE_version $server {
    ~*V1$ server_01;
    ~*V2$ server_02;
    default server_01;
}
server {
    listen 80;
    server_name www.server.com;

    location / {
        proxy_pass http://$server;
        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;
    }
}

二、根據權重實現灰度配置

upstream server {
    server 192.168.1.100:8080 max_fails=1 fail_timeout=60 weight=5;
    server 192.168.1.101:8080 max_fails=1 fail_timeout=60 weight=1;
}
server {
    listen 80;
    server_name www.server.com;

    location / {
        proxy_pass http://server;
        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實現灰度配置

(1)、資源在不一樣服務器上

upstream server_01 {
    server 192.168.1.100:8080 max_fails=1 fail_timeout=60;
}
upstream server_02 {
    server 192.168.1.101:8080 max_fails=1 fail_timeout=60;
}
server {
    listen 80;
    server_name www.server.com;

    set $server "server_01";
    if ($remote_addr ~ "211.118.119.11"){
        set $server server_02;
    }
    location / {
        proxy_pass http://$server;
        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;
    }
}

(2)、資源在同一服務器上

server {
    listen 80;
    server_name www.server.com;

    set $rootdir "/var/www/html";
    if ($remote_addr ~ "211.118.119.11"){
        set $rootdir "/var/www/test";
    }
    location / {
        root $rootdir;
        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;
    }
}

四、Nginx+Lua實現灰度配置

#若是來源IP地址是ipList.conf中的地址,那麼就定位到test_env,若是來源IP地址不在ipList.conf中(即有效用戶IP),那麼就定位到product_env。

local ip_config = ngx.shared.config;
ClienIP=ngx.req.get_headers()["X-Real-IP"]
if ClientIP == nil then
    ClientIP = ngx.req.get_headers()["x_forworded_for"]
end
if ClientIP == nil then
    ClientIP = ngx.var.remote_addr
end
for line in io.lines("/usr/local/nginx/conf/lua/ipList.conf") do
    if not ip_config:get(line) then
        ip_config:set(line, "0")
    end
end
if ip_config:get(ClientIP) == "0" then
    ngx.exec("@test_env")
else
    ngx.exec("@product_env")
end

ipList.conf內容格式
XXX.XXX.XXX.XXX
YYY.YYY.YYY.YYY

lua_code_cache on;
lua_shared_dict config 1m;

upstream MyServer {
    server 192.168.1.199:8099 max_fails=3 fail_timeout=30s;
    server 192.168.1.200:8099 max_fails=3 fail_timeout=30s;
    ip_hash;
}
server {
    listen 80;
    server_name jokerzhang.cn;
    access_log off;
    #access_log logs/jokerzhang.log;

    location / {
        access_by_lua_file /usr/local/nginx/conf/lua/ip_gray.lua;
    }
    location @test_env {
        proxy_pass http://192.168.1.199:8099;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    location @product_env {
        proxy_pass http://MyServer;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
相關文章
相關標籤/搜索