前置了解

Nginx 对并发的支持

http {
  limit_conn_zone $http_user_agent zone=perua:10m;

  server {
    location / {
      ……
      limit_conn perua 5;
      ……
    }
  }
}

上述配置解释:

  1. zone=perua。设置作用域,所有需要使用该limit策略的限制目标,指定作用域为该ua即可。

  2. limit_conn perua 5。表示限制同一个user_agent的最高连接数为5。实质含义表现:如果某个user_agent已经向某个server发出了5个请求,并且请求还未返回,那么来自该user_agent的新请求将会被拒绝。

支持对不同ua差异化限流

worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    # 创建一个map对象,指定ua的白名单
    map $http_user_agent $types_ua {
        default     0; # 默认

        one 1; # 定义第一类ua,类型为1.
        one1 1;
        one2 1;
        one3 1;

        two 2; # 定义第二类ua,类型为2.
        two1 2;
        two2 2;
        two3 2;

        three 3; # 定义第三类ua,类型为3。
        three1 3;
        three2 3;
        three3 3;
    }

    # 定义default作用域及访问速率
    limit_req_zone $default zone=default_req_zone:10m rate=5r/m;
    limit_conn_zone $default zone=default_conn_zone:10m;
    # 定义one作用域及访问速率
    limit_req_zone $one zone=one_req_zone:10m rate=5r/m;
    limit_conn_zone $one zone=one_conn_zone:10m;
    # 定义two作用域及访问速率
    limit_req_zone $two zone=two_req_zone:10m rate=5r/m;
    limit_conn_zone $two zone=two_conn_zone:10m;
    # 定义three作用域及访问速率
    limit_req_zone $three zone=three_req_zone:10m rate=5r/m;
    limit_conn_zone $three zone=three_conn_zone:10m;

    server {
        listen       8080;
        server_name  localhost;

        location /delayProcess {
            limit_req_status 429;
            limit_conn_status 429;
            proxy_pass ${server_addr};

            # 定义默认ua规则
            limit_req zone=default_req_zone burst=20 nodelay;
            limit_conn default_conn_zone 5;
            # 定义类型一ua规则
            limit_req zone=one_req_zone burst=20 nodelay;
            limit_conn one_conn_zone 10;
            # 定义类型二ua规则
            limit_req zone=two_req_zone burst=20 nodelay;
            limit_conn two_conn_zone 15;
            # 定义类型三ua规则
            limit_req zone=three_req_zone burst=20 nodelay;
            limit_conn three_conn_zone 20;
            # 白名单匹配:默认类型走default规则
            if ($types_ua = 0) {
                set $default $http_user_agent;
            }
            # 白名单匹配:1号类型走1号规则
            if ($types_ua = 1) {
                set $one $http_user_agent;
            }
            # 白名单匹配:2号类型走2号规则
            if ($types_ua = 2) {
                set $two $http_user_agent;
            }
            # 白名单匹配:3号类型走3号规则
            if ($types_ua = 3) {
                set $three $http_user_agent;
            }
        }

        error_page   500 502 503 504  /50x.html;
        error_page   429 /429;
        location = /429 {
            default_type application/json;
                add_header Content-Type 'text/html; charset=utf-8';
                return 200 '{"code":"429,"msg":"访问高峰期..."}\n';
        }
        location = /50x.html {
            root   html;
        }
    }
    include servers/*;
}