菜鸟笔记
提升您的技术认知

nginx的限流操作(控制速率||控制并发量)

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;
	}
	}