一、限流
流量限制 (rate-limiting),是Nginx中一个非常实用,却经常被错误理解和错误配置的功能。我们可以用来限制用户在给定时间内HTTP请求的数量。请求,可以是一个简单网站首页的GET请求,也可以是登录表单的 POST 请求。
流量限制可以用作安全目的,比如可以减慢暴力密码破解的速率。通过将传入请求的速率限制为真实用户的典型值,并标识目标URL地址(通过日志),还可以用来抵御 DDOS 攻击。更常见的情况,该功能被用来保护上游应用服务器不被同时太多用户请求所压垮。
Nginx的”流量限制”使用漏桶算法(leaky bucket algorithm),该算法在通讯和分组交换计算机网络中广泛使用,用以处理带宽有限时的突发情况。就好比,一个桶口在倒水,桶底在漏水的水桶。如果桶口倒水的速率大于桶底的漏水速率,桶里面的水将会溢出;同样,在请求处理方面,水代表来自客户端的请求,水桶代表根据”先进先出调度算法”(FIFO)等待被处理的请求队列,桶底漏出的水代表离开缓冲区被服务器处理的请求,桶口溢出的水代表被丢弃和不被处理的请求。
二、配置
“流量限制”配置两个主要的指令,limit_req_zone和limit_req。
10.8.161.34:代理机服务器 10.8.161.112:网页服务器
代理服务器操作:
[root@cheng ~]# vim /etc/nginx/conf.d/default.conf
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
upstream myweb {
server 10.8.161.112:80;
}
server {
listen 80;
server_name localhost;
location /login {
limit_req zone=mylimit burst=2; #burst定义区域容量大小,详见处理突发
limit_req_log_level warn; #可无,日志级别,详见相关功能之日志
limit_req_status 403; #可无,指定返回错误代码,详见下
proxy_pass http: