在接入层Nginx限制每个IP的并发请求数为10,每秒钟最大请求数为10。需要支持白名单IP,在白名单范围内的,不需要限速。
IP:由于Nginx隐藏在阿里云各种网络设备的后端,所以使用remoteaddr是取不到客户的真实IP的。一个思路是通过remoteaddr是取不到客户的真实IP的。一个思路是通过x_forwarded_for,取得代理链上所有的IP,然后解析出客户端IP。
其实阿里云前端的网络设备会把客户的终端地址通过HTTP头x_real_ip传递过来,所以只需要$http_x_real_ip即可取得客户的真实IP。
在nginx的http节点增加以下配置:
map $http_x_real_ip $limit {
default $http_x_real_ip;
#self IP
"127.0.0.1" "";
}
limit_conn_zone $limit zone=ipc:20m;
limit_req_zone $limit zone=ipr:20m rate=10r/s;
在location节点增加以下配置:
limit_conn ipc 10;
limit_req zone=ipr burst=5 nodelay;
limit_conn和limit_req命令的详细使用请参考:
http://nginx.org/en/docs/http/ngx_http_limit_req_module.html
http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html#limit_conn_zone_req