• 微信
    咨询
    微信在线咨询 服务时间:9:00-18:00
    纵横数据官方微信 使用微信扫一扫
    马上在线沟通
  • 业务
    咨询

    QQ在线咨询 服务时间:9:00-18:00

    选择下列产品马上在线沟通

    纵横售前-老古
    QQ:519082853 售前电话:18950029581
    纵横售前-江夏
    QQ:576791973 售前电话:19906048602
    纵横售前-小李
    QQ:3494196421 售前电话:19906048601
    纵横售前-小智
    QQ:2732502176 售前电话:17750597339
    纵横售前-燕子
    QQ:609863413 售前电话:17750597993
    纵横值班售后
    QQ:407474592 售后电话:18950029502
    纵横财务
    QQ:568149701 售后电话:18965139141

    售前咨询热线:

    400-188-6560

    业务姚经理:18950029581

  • 关注

    关于纵横数据 更多优惠活动等您来拿!
    纵横数据官方微信 扫一扫关注官方微信
  • 关闭
  • 顶部
  • 您所在的位置 : 首页 > 新闻公告 > 南京云主机Nginx如何配置请求限流?

    南京云主机Nginx如何配置请求限流?

    网站上线后,最怕的就是突然来一波异常流量把后端服务打崩。无论是恶意爬虫高频刷接口、接口被脚本党薅羊毛,还是促销活动流量突增,如果没有一层有效的限流防护,后端数据库和应用程序很容易被瞬间压垮。Nginx作为南京云主机上最常用的反向代理服务器,本身就内置了强大的限流能力,不需要额外安装任何第三方模块,配置得当就能挡住绝大多数异常流量。下面从原理到实战,完整梳理Nginx请求限流的配置方法。

    一、Nginx限流的两大核心武器

    Nginx提供了两个官方限流模块,分别应对不同的防护场景。

    第一个是ngx_http_limit_req_module,负责限制请求速率,也就是控制单个IP在单位时间内的请求次数。它基于漏桶算法实现,适合应对高频刷接口、恶意爬虫等场景。比如一个正常用户浏览网页,每秒最多产生两三个请求,如果有人每秒发几百个请求过来,那大概率不是正常用户。

    第二个是ngx_http_limit_conn_module,负责限制并发连接数,也就是控制单个IP同时能建立多少条TCP连接。它适合防止单IP大量长连接占满服务器连接池,在文件下载、长连接等场景中效果显著。

    两者搭配使用,既能限制请求频率,又能限制并发数量,形成完整的流量防护屏障。

    二、配置请求速率限制

    打开Nginx主配置文件,在http块中定义限流区域:

    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;

    这行配置的含义是:以客户端IP的二进制格式作为限流依据,创建一个名为req_limit的共享内存区域,大小为10MB(大约能存储16万个IP的状态记录),限制每个IP每秒最多发出10个请求。这里使用$binary_remote_addr而不是$remote_addr,是因为二进制格式更节省内存,IPv4只占4字节,IPv6占16字节。

    然后在需要限流的location块中应用这个规则:

    location /api/ {
    limit_req zone=req_limit burst=20 nodelay;
    limit_req_status 429;
    proxy_pass http://backend;
    }

    burst=20表示允许突发20个请求进入缓冲区排队,而不是超出rate就立即拒绝。nodelay表示这些突发请求不排队等待,直接处理,只有超出burst数量的请求才会被拒绝。如果不加nodelay,突发请求会按照rate的速率排队延迟处理,用户会明显感受到响应变慢。limit_req_status 429将默认的503状态码改为429 Too Many Requests,这是HTTP协议中专门用于限流的标准状态码,对前端和搜索引擎更友好。

    三、配置并发连接数限制

    在http块中定义连接限制区域:

    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

    然后在location块中应用:

    location /api/ {
    limit_conn conn_limit 10;
    proxy_pass http://backend;
    }

    limit_conn conn_limit 10表示每个IP最多同时建立10条并发连接。这个配置对于防止单IP通过大量长连接耗尽服务器资源非常有效。需要注意的是,在HTTP/2多路复用场景下,连接数限制的效果会弱化,因为多个请求可以共享同一条连接。

    四、一个真实案例:电商秒杀接口的限流防护

    某电商平台的南京云主机上部署了一套秒杀系统,后端是Java微服务集群。上线后第一次做促销活动,流量瞬间翻了十几倍,大量用户和脚本同时涌入秒杀接口,后端数据库连接池在几秒内被耗尽,整个服务直接瘫痪,用户看到的是一片502错误。

    事后复盘发现,问题根源在于Nginx层面没有任何限流措施,所有请求无论正常还是异常,都被原封不动地转发到了后端。按照以下方案添加限流配置后,情况得到了根本性改善:

    在http块中添加:

    limit_req_zone $binary_remote_addr zone=seckill_limit:10m rate=5r/s;
    limit_conn_zone $binary_remote_addr zone=seckill_conn:10m;

    在秒杀接口的location块中添加:

    location /api/seckill/ {
    limit_req zone=seckill_limit burst=10 nodelay;
    limit_req_status 429;
    limit_conn seckill_conn 5;
    proxy_pass http://seckill_backend;
    }

    这套配置的效果是:每个IP每秒最多5个请求,允许突发10个,超出部分直接返回429;每个IP最多5条并发连接。重新压测后,后端服务的请求量被平稳地控制在了可承受范围内,即使面对脚本刷单也能从容应对,服务全程稳定运行。

    五、白名单机制:避免误伤正常流量

    全局限流有一个潜在风险,就是可能误伤内部监控、运维工具或合作方的正常请求。可以通过geo和map模块实现白名单绕过:

    geo $whitelist {
    default 1;
    10.0.0.0/8 0;
    172.16.0.0/12 0;
    192.168.0.0/16 0;
    }

    map $whitelist $limit_key {
    0 "";
    1 $binary_remote_addr;
    }

    limit_req_zone $limit_key zone=req_limit:10m rate=10r/s;

    这段配置的原理是:内网IP段被标记为白名单,对应的$limit_key为空字符串,Nginx遇到空字符串key时会自动跳过限流检查,从而实现白名单放行。

    六、进阶技巧:多维度限流与干跑模式

    除了基于IP限流,Nginx还支持基于其他维度进行限流。比如基于API Key限流,可以将limit_req_zone的key改为$http_x_api_key,这样每个API密钥都有独立的速率配额。基于请求URI限流,可以将key改为$request_uri,对不同接口设置不同的限流策略。

    如果你的Nginx版本在1.17.1以上,还可以使用limit_req_dry_run on开启干跑模式。这个模式下Nginx会记录哪些请求会被限流,但不会实际拒绝它们,非常适合在生产环境上线限流策略前做观察和调参,避免配置过于激进误伤正常用户。

    七、验证限流是否生效

    配置完成后,执行nginx -t检查语法,确认无误后执行nginx -s reload重载配置。然后用ab或wrk等压测工具模拟高频请求,观察返回结果中是否出现了429状态码。也可以在Nginx的error_log中查看限流相关的日志记录,确认限流规则正在按预期工作。

    总结

    南京云主机上Nginx的请求限流配置,核心思路是"速率限制加连接限制双管齐下"。通过limit_req_zone和limit_req控制单IP的请求频率,通过limit_conn_zone和limit_conn控制单IP的并发连接数,再配合白名单机制避免误伤、干跑模式辅助调参,就能构建起一套轻量高效的流量防护体系。这套方案不需要额外安装任何模块,配置简单、性能开销极低,是保护后端服务稳定运行的第一道防线。

    纵横云服务器租赁,欢迎随时联系,客服联系方式:QQ3494196421,手机微信19906048601。



    最新推荐


    微信公众帐号
    关注我们的微信