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
朱敬志(brian),成功不是将来才有的,而是从决定去做的那一刻起,持续累积而成。