Nginx限速
在WEB开发中经常会遇到接口被刷的情况,如CC攻击,通过有限的ip对服务器发来大量请求,使服务器资源耗尽。使用nginx的ngx_http_limit_req_module 模块和ngx_http_limit_conn_module模块可以对统一ip的请求和连接数进行限制。
1,ngx_http_limit_req_module模块,用来限制连单位时间内连接数的模块,是对一段时间内的连接数限制。设置一块共享内存限制域用来保存键值的状态参数
语法:
limit_req_zone $variable zone=name:size rate=rate; 其中$variable是键,zone是区域名,limit_req会使用,size是内存大小,rate是连接数限制每秒/每分。
limit_req zone=name [burst=number] [nodelay];设置对应的共享内存限制域和允许被处理的最大请求数阈值。 默认超过请求频率的请求会被延时处理,当超过阀值默认返回503。burst表示前一秒如未达到上线,其余量可以顺延给下一秒。nodelay表示不延时处理
limit_req_status code 设置拒绝请求的响应状态码,默认不设置为503
举例:
limit_req_zone $binary_remote_addr zone=addr_gift:10m rate=30r/s;
limit_req zone=addr_gift nodelay;
limit_req_status 403;
统一IP平均处理的请求频率不能超过每秒30次,且不延时执行,超过上限的返回 403。
2,ngx_http_limit_conn_module模块,用来限制单个ip的并发连接数,是对同一时刻的连接数限制。
语法:
limit_conn_zone $variable zone=name:size;$variable定义键,zone=name定义区域名称,size定义各个键共享内存空间大小。
limit_conn zone_name number,指定每个给定键值的最大同时连接数,当超过这个数字时默认被返回503。
limit_conn_status code; 。指定当超过限制时,返回的状态码。默认是503。
举例:
limit_conn_zone $binary_remote_addr zone=addr_conn:10m;
limit_conn addr_conn 50;
limit_conn_status 403;
统一IP并发连接数50,超过限制返回403