nginx的限流主要有两种形式,控制速率或者控制最大的连接数
控制速率
先上conf配置:
#限流设置
limit_req_zone $binary_remote_addr zone=contentratelimit:10m rate=10r/s;
server {
listen 80;
#监听的域名
server_name localhost;
#表示所有以 localhost/read_content的请求都由该配置处理
location /read_content {
#使用指定限流配置,burst=4表示允许同时有4个并发连接,如果不能同时处理,则会放入队列,等请求处理完成后,再从队列中拿请求
#nodelay 并行处理所有请求
limit_req zone=contentratelimit burst=4 nodelay;
#content_by_lua_file:所有请求都交给指定的lua脚本处理(/root/lua/read_content.lua)
content_by_lua_file /usr/local/server/lua/read_content.lua;
}
}
}
burst表示超过设定的处理速率后能额外处理的请求数,当rate=10r/s,即100ms处理一个请求。
这里burst=4,若有4个请求到达,nginx先处理第一个,剩下3个放队列,每隔100ms从队列中取一个出来处理,若大于4个将拒绝多余的请求,直接返回503。
当burst=50时,第50个请求就要等50*100ms=5s,显然不合理,所以会结合nodelay一起使用。(并行处理,不延迟)
控制并发量(连接数)
ngx_http_limit_conn_module提供限制连接数的能力,主要利用 limit_conn_zone, limit_conn指令来实现,利用连接数限制某一个用户的ip连接的数量来控制流量
ps:并非所有连接都有计算在内,只有当服务器正在处理请求并且读取整个请求头,才会计算有效连接。
#根据ip地址来限制,存储内存大小10m
limit_conn_zone $binary_remote_addr zone=addr:10m;
#个人ip显示
limit_conn_zone $binary_remote_addr zone=perip:10m;
#针对整个服务所有的并发量控制
limit_conn_zone $server_name zone=perserver:10m;
server {
listen 80;
#监听的域名
server_name localhost;
location /brand {
limit_conn perip 3; #单个客户端ip与服务器的连接数.
limit_conn perserver 5; #限制与服务器的总连接数
#同一个ip只允许有2个并发连接
#limit_conn addr 2;
proxy_pass http://192.168.211.1:18081;
}
}