限速相关的模块以及使用
记录下nginx 限速相关的模块以及使用
nginx 一共有3个限速相关模块,分别是
1:ngx_http_limit_req_module
2:ngx_http_limit_conn_module
3:Module ngx_http_core_module
3个模块都默认编译到nginx 核心模块里,自定义编译nginx 需要查看是否有编译
ngx_http_limit_req_module
一句话:限制请求的速率
详细解析:ngx_http_limit_req_module模块(0.7.21)用于限制每一个定义的 key 的请求的处理速率,特别是从一个单一的IP地址的请求的处理速率。使用“泄漏桶”方法可以完成此限制。
句法: limit_req zone=name [burst=number] [nodelay | delay=number];
默认: 不限制
语境: http,server,location
示例
http {
#这个必须在http里定义,定义一个以 binary_remote_addr 为key 名字为perip_req 的内存空间 漏斗速度每秒30个请求,速度需要整数,要2s/r 则用30r/m
limit_req_zone $binary_remote_addr zone=perip_req:10m rate=30r/s;
#这里可以定义一个以服务器为key 的总速度
limit_req_zone $server_name zone=perserver_req:10m rate=1000r/s;
...
server {
...
#仅对php链接进行限制
location ~ \.php$ {
#同一ip限制速度10个每秒 缓冲池为10,这个burst 是对应ip的,nodelay 是指及时处理缓冲池的链接,没有缓冲池会按规定速度处理
limit_req zone=perip_req burst=500 nodelay;
limit_req zone=perserver_req burst=5000 nodelay;
}
}
}
官网链接:ngx_http_limit_req_module详细说明
ngx_http_limit_conn_module
一句话:限制请求的并发,有点这个没有上面的灵活,不能设置缓冲池
详细解析:ngx_http_limit_conn_module模块用于限制每个定义的键的连接数,特别是来自单个IP地址的连接数。
并非所有连接都被计数。仅当连接具有服务器正在处理的请求并且已经读取了整个请求标头时,才对连接进行计数。
句法: limit_conn zone number;
默认: 不限制
语境: http,server,location
示例
http {
#这里注意不要跟其他限速模块定义重名
limit_conn_zone $binary_remote_addr zone=perip_con:10m;
limit_conn_zone $server_name zone=perserver_con:10m;
...
serve {
...
location / download / {
limit_conn perip_con 1; #限制客户端相同ip并发为1
limit_conn perserver_con 100; #限制服务器总并发为100
}
}
}
官网链接:ngx_http_limit_conn_module详细说明
ngx_http_core_module
一句话:限制请求的带宽,一般用于文件下载限制
示例
http {
limit_conn_zone $binary_remote_address zone=perip:10m
...
server {
...
location /download/ {
# 限制每个IP只能建立一个连接
limit_conn perip 1;
# 当请求的流量超500KB后进行限速
limit_rate_after 500k;
# 限速 50KB/s
limit_rate 50k;
}
}
}
白名单使用
http {
geo $whiteiplist {
default 1;
127.0.0.1 0;
10.0.0.0/8 0;
121.207.242.0/24 0;
}
map $whiteiplist $limit {
1 $binary_remote_addr;
0 "";
}
limit_conn_zone $limit zone=limit:10m;
server {
listen 8080;
server_name test.ttlsa.com;
location ^~ /ttlsa.com/ {
limit_conn limit 4;
limit_rate 200k;
alias /data/www.ttlsa.com/data/download/;
}
}
}
解析:
- geo指令定义一个白名单$whiteiplist, 默认值为1, 所有都受限制。 如果客户端IP与白名单列出的IP相匹配,则$whiteiplist值为0也就是不受限制。
- map指令是将$whiteiplist值为1的,也就是受限制的IP,映射为客户端IP。将$whiteiplist值为0的,也就是白名单IP,映射为空的字符串。
- limit_conn_zone和limit_req_zone指令对于键为空值的将会被忽略,从而实现对于列出来的IP不做限制。
参考:https://blog.csdn.net/weixin_34101784/article/details/92620011