Nginx控制客户端请求的速率

时间:2023-03-09 14:18:22
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 ;
worker_rlimit_nofile ;
worker_cpu_affinity ;
error_log logs/error.log;
events {
worker_connections ;
}
http {
include mime.types;
server_tokens on;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout ;
limit_req_zone $binary_remove_addr zone=one:10m rate=1r/s; # 以请求的客户端IP作为key值,内存区域命名为one,分配10m内存空间,访问速率限制为1秒1次请求
client_header_timeout ;
client_boby_timeout ;
send_timeout ;
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 ;
worker_rlimit_nofile ;
worker_cpu_affinity ;
error_log logs/error.log;
events {
worker_connections ;
}
http {
include mime.types;
server_tokens on;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout ;
limit_req_zone $binary_remove_addr zone=one:10m rate=1r/s;
limit_req zone=one burst=5; # 使用前面定义的为one的内存空间,队列值为5,即可以有5个请求排队等候
client_header_timeout ;
client_boby_timeout ;
send_timeout ;
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