Nginx – 限流配置

Nginx配置限流的含义

为什么要Nginx限流?

我们都知道Nginx并发性很好,但是我们后台的Web服务器性能对比Nginx的并发来说,就很拉跨了。为了更好的保护后台应用,也是为了防止一些恶意攻击。我们就需要使用Nginx限流技术。

说到Nginx限流,我们需要了解到Nginx的限流方案。

  • 一 是控制速率:即服务程序每s允许多少请求通过
  • 二 是控制服务并发连接数:控制并发连接数,即允许多少并发量的请求通过

两种方式的解决方案。

Nginx限流配置说明

添加配置

控制速率采用漏桶算法,其他方式 需要单独研究

http块添加限流规则contentRateLimit(此命名自定义)

# 限流设置:$binary_remote_addr:根据请求IP进行限流,不可变。
    # contentRateLimit:缓存空间名称,可自定义。
    # 10m:定义缓存空间大小。
    # rate=2r/s:每秒允许有2个请求被处理。
    limit_req_zone $binary_remote_addr zone=contentRateLimit:10m rate=2r/s;

server 的 location块添加 使用限流规则名为contentRateLimit

# 使用限流配置
            limit_req zone=contentRateLimit;

上述配置的含义:

binary_remote_addr 是一种key,表示基于 remote_addr(客户端IP) 来做限流,binary_ 的目的是压缩内存占用量。

zone:定义共享内存区来存储访问信息, contentRateLimit:10m 表示一个大小为10M,名字为contentRateLimit的内存区域。注意:1M能存储16000 IP地址的访问信息,10M可以存储16W IP地址访问信息。基本是足够的! rate 用于设置最大访问速率,rate=10r/s 表示每秒最多处理10个请求。

Nginx 实际上以毫秒为粒度来跟踪请求信息,因此 10r/s 实际上是限制:每100毫秒处理一个请求。这意味着,自上一个请求处理完后,若后续100毫秒内又有请求到达,将拒绝处理该请求.我们这里设置成2 方便测试。

location块突发流量处理 加入burst

limit_req zone=contentRateLimitburst=4;

burst=4,若同时有4个请求到达,Nginx 会处理第一个请求,剩余3个请求将放入队列,如果设置的rate=2r/s 则代表每隔500ms从队列中获取一个请求进行处理。若等待队列的请求数大于4,将拒绝后续多余的请求,直接返回503。

一般加入 burst 可选择(也推荐)加上 nodelay 意为:不延迟,具体含义就是:直接开始执行,不放入队列中。

案例说明:rate=2r/s; limit_req zone=contentRateLimit burst=4 nodelay;

1秒内 发送2个 全部的请求正常。

1秒内 发送6个 全部的请求正常(没有请求阻塞)。

1秒内 发送8个请求 前6个请求正常,后面2个直接503异常。

如果删除了 nodelay。场景是:1秒内发送了8个请求。

第一秒处理2个请求,队列放入4个请求,最后2个请求503。第二秒处理队列中的2个请求,此时队列剩余2个请求。

第三秒处理队列中的2个请求,此时队列剩余0个请求。

# 使用限流配置contentRateLimit ,nodelay 不延迟
        limit_req zone=contentRateLimit burst=4 nodelay;

防止IP爆破案例

# local块中加入
        limit_conn addr 20;   表示 同一个地址只允许连接20次。

从宝塔拿下来的配置,此处可不看,直接看下文伪代码

http{
# ① 存储个人请求IP的限流容量
limit_conn_zone $binary_remote_addr zone=perip:10m;

# ② 配置服务程序请求规则
limit_conn_zone $server_name zone=perserver:10m; 

server {  
    listen       80;
    server_name  localhost;
    charset utf-8;
    location / {
        limit_conn perip 10;         # 单个客户端ip与服务器的连接数.
        limit_conn perserver 100;    # 限制与服务器的总连接数
        root   html;
        index  index.html index.htm;
    }
}
}

location块内容

# ③ 并发限制 服务器最多处理300个连接
    limit_conn perserver 300;

    # ④ 单IP限制 最多25个连接。需配置上文的
    limit_conn perip 25;

    # ⑤ 流量限制,用户下载速度限制在512k
    limit_rate 512k;

完整的违代码

查看①、②即可!

user  www www;
worker_processes auto;
error_log  /www/wwwlogs/nginx_error.log  crit;
pid        /www/server/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;


http
    {
        # ① Http块 依次配置客户端、服务端、请求速度全局配置
        limit_conn_zone $binary_remote_addr zone=perip:10m;
        limit_conn_zone $server_name zone=perserver:10m;
        limit_req_zone $binary_remote_addr zone=contentRateLimit:10m rate=2r/s;

    server
    {
        listen 80;
        server_name 121.4.32.201;
        index index.html index.htm index.php;

        location ~ .*\.(exe|doc|pdf|zip|rar)$
        {
            # ② location块 添加相应的限制
            limit_rate_after 10M;       # 资源不限速范围,超出后开始限速
            limit_rate  200k;           # 资源超出不限速范围后,限速为200k
            limit_req zone=contentRateLimit burst=3 nodelay;    # 使用nodelay含义:同一秒内:请求数大于5(burst+rate)时候,之后的新请求直接503

            limit_conn perip 3;        # 限制每个IP只能建立3个连接。超出多连接,直接响应 503 Service Temporarily Unavailable

            limit_conn perserver 300;        # 本配置似乎受到了contentRateLimit的限制,rate=2r/s 本意是:Http块的限制服务器最大处理300个链接。超出多连接,直接响应 503 Service Temporarily Unavailable
        }
    }

}

Nginx对资源限速,请查看

特殊说明: 以上文章,均是我实际操作,写出来的笔记资料,不会盗用别人文章!烦请各位,请勿直接盗用!转载记得标注来源!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序之路2020/6/3

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值