插件窝 干货文章 Nginx根据请求IP末段进行分流如何配置

Nginx根据请求IP末段进行分流如何配置

backend group Nginx server 138    来源:    2025-04-23

Nginx根据请求IP末段进行分流配置

要根据客户端IP地址的最后一段(即IP地址的第四部分)进行分流,可以使用Nginx的$remote_addr变量结合map指令或if条件判断来实现。以下是几种配置方法:

方法一:使用map指令

http {
    map $remote_addr $backend {
        default        backend_default;
        "~\.1$"        backend_group1;  # IP末位是1的
        "~\.2[0-4]$"   backend_group2;  # IP末位20-24的
        "~\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9])$" backend_group3; # 其他IP
    }

    upstream backend_default {
        server 10.0.0.1:80;
    }

    upstream backend_group1 {
        server 10.0.0.2:80;
    }

    upstream backend_group2 {
        server 10.0.0.3:80;
    }

    upstream backend_group3 {
        server 10.0.0.4:80;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://$backend;
        }
    }
}

方法二:使用if条件判断

server {
    listen 80;

    set $backend "backend_default";

    # 提取IP最后一段
    if ($remote_addr ~* \.(\d+)$) {
        set $last_octet $1;
    }

    # 根据最后一段分配后端
    if ($last_octet ~* ^[1-9]$) {
        set $backend "backend_group1";
    }
    if ($last_octet ~* ^1[0-9]$) {
        set $backend "backend_group2";
    }
    if ($last_octet ~* ^2[0-4]$) {
        set $backend "backend_group3";
    }

    location / {
        proxy_pass http://$backend;
    }
}

upstream backend_default {
    server 10.0.0.1:80;
}

upstream backend_group1 {
    server 10.0.0.2:80;
}

upstream backend_group2 {
    server 10.0.0.3:80;
}

upstream backend_group3 {
    server 10.0.0.4:80;
}

方法三:使用Lua脚本(需要安装ngx_http_lua_module)

server {
    listen 80;

    location / {
        access_by_lua_block {
            local last_octet = ngx.var.remote_addr:match("(%d+)$")
            if tonumber(last_octet) <= 50 then
                ngx.var.backend = "backend_group1"
            else
                ngx.var.backend = "backend_group2"
            end
        }

        proxy_pass http://$backend;
    }
}

注意事项

  1. $remote_addr获取的是直接与Nginx建立连接的客户端IP,如果Nginx前面有代理服务器,需要使用$http_x_forwarded_for或其他真实IP获取方式

  2. 使用if条件判断时要注意Nginx的if指令的限制,避免在location中使用过多的if

  3. 对于复杂的IP分流规则,建议使用map指令或Lua脚本实现

  4. 配置完成后,使用nginx -t测试配置语法,然后nginx -s reload重新加载配置

  5. 可以使用Nginx的log_format记录客户端IP和后端选择情况,便于调试

log_format routing '$remote_addr - $backend [$time_local] "$request"';
access_log /var/log/nginx/routing.log routing;

以上配置可以根据实际需求调整IP分段规则和后端服务器地址。