插件窝 干货文章 Nginx如何通过header中的标识进行分发

Nginx如何通过header中的标识进行分发

backend HTTP Header server 765    来源:    2025-04-27

Nginx通过Header标识进行分发的方法

Nginx可以通过检查HTTP请求头(header)中的特定标识来进行请求分发,这是一种常见的流量控制方法。以下是几种实现方式:

1. 使用map指令进行分发

http {
    map $http_x_custom_header $backend {
        default        backend_default;
        "mobile"      backend_mobile;
        "desktop"     backend_desktop;
        "api-v1"      backend_api_v1;
    }

    upstream backend_default {
        server 192.168.1.10:8080;
    }

    upstream backend_mobile {
        server 192.168.1.11:8080;
    }

    upstream backend_desktop {
        server 192.168.1.12:8080;
    }

    upstream backend_api_v1 {
        server 192.168.1.13:8080;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://$backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }
    }
}

2. 使用if条件判断

server {
    listen 80;

    location / {
        if ($http_x_custom_header = "mobile") {
            proxy_pass http://backend_mobile;
        }

        if ($http_x_custom_header = "desktop") {
            proxy_pass http://backend_desktop;
        }

        proxy_pass http://backend_default;
    }
}

3. 使用server_name和正则表达式

server {
    listen 80;
    server_name ~^(?<subdomain>.+)\.example\.com$;

    location / {
        if ($http_x_custom_header = $subdomain) {
            proxy_pass http://backend_$subdomain;
        }

        proxy_pass http://backend_default;
    }
}

4. 使用split_clients模块进行AB测试

http {
    split_clients "${http_x_user_id}" $variant {
        50%     backend_a;
        50%     backend_b;
    }

    upstream backend_a {
        server 192.168.1.20:8080;
    }

    upstream backend_b {
        server 192.168.1.21:8080;
    }

    server {
        listen 80;

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

注意事项

  1. 变量格式:$http_前缀后跟header名称,其中-需要替换为_(例如X-Custom-Header对应$http_x_custom_header

  2. 性能考虑:map指令比if条件更高效,推荐优先使用map

  3. 安全性:确保header值被正确验证,防止注入攻击

  4. 默认处理:总是为未匹配的情况提供默认后端

  5. 日志记录:考虑记录分发决策以便调试

通过以上方法,你可以灵活地基于HTTP请求头中的各种标识(如设备类型、API版本、用户ID等)进行请求分发。