Nginx提供了两种限流手段:一是控制速率,二是控制并发连接数。
1.控制速率
使用limit_req_zone来限制单位时间内的请求数,即速率限制,示例配置如下:
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s; server { location / { limit_req zone=mylimit; } }
以上配置表示,限制每个IP访问的速度为2r/s,因为Nginx的限流统计是基于毫秒的,我们设置的速度是2r/s,转换一下就是500ms内单个IP只允许通过1个请求,从501ms开始才允许通过第2个请求。
速率限制允许突发burst:
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s; server { location / { limit_req zone=mylimit burst=4; } }
burst=4表示每个IP最多允许4个突发请求。
2.控制并发连接数
利用limit_conn_zone和limit_conn两个指令即可控制并发数,示例配置如下:
limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; server { ... limit_conn perip 10; limit_conn perserver 100; }
其中limit_conn perip 10表示限制单个IP同时最多能持有10个连接;limit_conn perserver 100表示server同时能处理并发连接的总数为100个。
PS:只有当request header被后端处理后,这个连接才进行计数。