Nginx 限流及WAF

发布时间 2023-09-15 17:43:39作者: Msea

Nginx 提供了两种限流手段:一是控制速率,二是控制并发连接数。
控制速率是按: limit_req_zone来限制单位时间内容的请求书,即速率限制。
控制并发数: 利用limit_conn_zone和limit_conn两个指令来控制并发数.

1.ngx_http_limit_conn_module

ngx_http_limit_conn_modul: 基于key($binary_remote_addr或者server_name),对网络总连接数进行限流。
http{
# 针对客户端地址,进行连接数限制
limit_conn_zone $binary_remote_addr zone=perip:10m;
# 针对域名,进行连接数限制
limit_conn_zone $server_name zone=perserver:10m;
limit_conn_log_level error;
limit_conn_status 503;

 

server {
# 每个IP仅允许发起10个连接
limit_conn perip 10;
# 每个域名仅允许发起100个连接
limit_conn perserver 100;
}
limit_conn_zone: 用于配置限流key及存放限流key对应的共享内存大小;
limit_conn_log_level: 请求被限流后的日志级别,默认error级别;
limit_conn_status:请求被限流后返回的http状态码,默认503;
limit_conn:配置存放key的共享内存区域名称和指定key的最大连接数;

 

2. ngx_http_limit_req_module限流
   ngx_http_limit_req_module:基于key(基本上为客户端IP地址)对请求进行限流(基于漏桶算法)。

   

http{
# 固定请求速率为1个请求/每秒
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
limit_req_log_level error;
limit_req_status 503;

server {
location /search/ {
# 漏桶容量为5
limit_req zone=one burst=5 nodelay;
}
}
}

limit_req_zone:配置限流key,存放key的共享内存区域大小,以及固定请求速率;
limit_req_log_level: 参照limit_conn_log_level;
limit_req_status:参照limit_conn_status;
limit_req: 配置限流区域,漏桶容量(突发容量,默认为0),是否采用延迟模式(默认延迟);

3.lua-resty-limit-traffic
 使用场景比较固定的情况下,推荐使用自有模块。
 需求比较复杂时(产品要求动态化设置时),建议采用lua-resty-limit-traffic实现限流请求(较新的openresty已自动包含此库,无需手动引入)。

 lua-resty-limit-traffic模块主要由以下四个子模块构成:

resty.limit.req:基于漏桶算法对请求进行限流操作;
resty.limit.count:基于固定窗口实现流量控制;
resty.limit.conn:实现请求限流以及流量整形;
resty.limit.traffic:提供聚合器,以便整合resty.limit.req、resty.limit.count以及resty.limit.conn。

4.ngx_stream_limit_conn_module
此模块在TCP/UDP会话的Pre-access阶段被处理。

我的配置

# ngx_http_limit_conn_module 针对客户端地址,进行连接数限制
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
limit_conn perserver 350;
limit_conn perip 50;
limit_rate 512k;
limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=60r/s;

以为仅对部分API的保护,如果需要更多针对网站洪泛攻击等CC攻击,需要搭建WAF防火墙来保护,再结合黑白名单。

免费WAFk可以参考:https://zhuanlan.zhihu.com/p/638489965

如果动手能力强,可以用Lua搭建,参考:https://developer.aliyun.com/article/608423