nginx使用header进行分流

1,064 阅读1分钟

前言

nginx本质上是一个代理服务器, 我们要对nginx 进行分流。具体实现需求:

  1. 在登录的时候, 随机选择一个节点完成认证操作,并在返回登录结果的时候指定由哪个节点负责处理业务.
  2. 在登录成功后, 所有请求由nginx负责分流到一个固定的节点进行处理.

补充知识

location 指令匹配优先级

模式优先级含义
location = /uri0= 表示精确匹配,只有完全匹配上才能生效, 最高优先级
location ^~ /uri1^~ 开头对URL路径进行前缀匹配,并且在正则之前。
location ~ pattern2开头表示区分大小写的正则匹配
location ~* pattern3开头表示不区分大小写的正则匹配
location /uri4不带任何修饰符,也表示前缀匹配,但是在正则匹配之后
location /5通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default, 最低优先级

登录配置

http {
    # 用于登录的时候选择网关 默认采用轮询方式 
    upstream nbadmin_exti_backend { 
        server 127.0.0.1:9200;
        server 127.0.0.1:9201;
        server 127.0.0.1:9202;
        server 127.0.0.1:9203;
    }

    # 登录成功后, 所有向服务器发送的请求都会有一个 x-sid header.
    # 服务器根据 x-sid 分配指定的节点提供服务.
    map $http_x_sid $nbadmin_sid_backend {
        0 http://127.0.0.1:9200;
        1 http://127.0.0.1:9201;
        2 http://127.0.0.1:9202;
        3 http://127.0.0.1:9203;
    }

    server {
        # 登录网关选择匹配 这里严格匹配, 优先级 0
        location = /api/user/login {
            proxy_pass  http://nbadmin_exti_backend;
            proxy_set_header        Host $host;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        X-Forwarded-Proto $scheme;
            proxy_set_header        Upgrade $http_upgrade;
            proxy_set_header        Connection "Upgrade";
            proxy_http_version      1.1;
            proxy_read_timeout      300s;
        }

        # 接下来根据 header 的 sid 进行分流 优先级 1
        location ^~ /api/.* {
            proxy_pass $nbadmin_sid_backend;
            proxy_set_header        Host $host;
            proxy_set_header        X-Real-IP $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        X-Forwarded-Proto $scheme;
            proxy_set_header        Upgrade $http_upgrade;
            proxy_set_header        Connection "Upgrade";
            proxy_http_version      1.1;
            proxy_read_timeout      300s;
        }

        # 最后时默认首页的匹配 优先级5
        location / {
            index index.html
        }

    }
}