Nginx控制客户端请求的速率

使用ngx_http_limit_req_module模块的两个参数

  ngx_http_limit_req_module模块用于限制每个IP访问每个定义key的请求速率

  1、limit_req_zone参数:

    limit_req_zone用于设置共享内存区域,key可以是字符串,nginx自带变量或前两个组合,如$binary_remove_addr。name为内存区域的名称,size为内存区域的大小,rate为速率,单位为r/s,每秒一个请求

    语法:

    参数语法:limit_req_zone key zone=name:size rate=rate;

    参数位置:http 标签块

    具体修改参数如下:(红色标记为添加或者修改内容)

[root@Nginx conf]# cat nginx.conf
worker_processes  4;
worker_rlimit_nofile 65535;
worker_cpu_affinity 0001 0010 0100 100;
error_log logs/error.log;
events {
    worker_connections  20480;
}
http {
    include       mime.types;
    server_tokens   on;
    sendfile        on;
    tcp_nopush        on;
    tcp_nodelay     on;
    keepalive_timeout 65;
    limit_req_zone $binary_remove_addr zone=one:10m rate=1r/s;   # 以请求的客户端IP作为key值,内存区域命名为one,分配10m内存空间,访问速率限制为1秒1次请求
    client_header_timeout 60;
    client_boby_timeout  60;
    send_timeout    60;
    client_max_boby_size  8m;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
include www_date/brian.conf;
include www_date/brianzjz.conf;
include www_date/status.conf;
}

  2、limit_req参数:

    参数语法:limit_req zone=name [burst=number][nodelay];

    参数位置:http、server、location 标签块

    这里运用到的是令牌桶原理,burst=num,一共有num块令牌,令牌发完后,多出来的那些请求就会返回503

    nodelay默认在不超过burst值的前提下会排队等待处理,如果使用此参数,就会处理完num+1次请求,剩余的请求都会视为超时,返回503

    具体修改参数如下:(红色标记为添加或者修改内容)

[root@Nginx conf]# cat nginx.conf
worker_processes  4;
worker_rlimit_nofile 65535;
worker_cpu_affinity 0001 0010 0100 100;
error_log logs/error.log;
events {
    worker_connections  20480;
}
http {
    include       mime.types;
    server_tokens   on;
    sendfile        on;
    tcp_nopush        on;
    tcp_nodelay     on;
    keepalive_timeout 65;
    limit_req_zone $binary_remove_addr zone=one:10m rate=1r/s;
    limit_req  zone=one burst=5;         # 使用前面定义的为one的内存空间,队列值为5,即可以有5个请求排队等候
    client_header_timeout 60;
    client_boby_timeout  60;
    send_timeout    60;
    client_max_boby_size  8m;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
include www_date/brian.conf;
include www_date/brianzjz.conf;
include www_date/status.conf;
}

    最后重启服务,我们可以使用ab压力测试工具来进行测试,然后实时的查看nginx 的访问日志:

ab -c 4 -n 1000 http://127.0.0.1

  

 

posted @ 2018-03-27 09:23  Brian_Zhu  阅读(836)  评论(0编辑  收藏  举报