Nginx抢购限流配置实现解析

因业务需求经常会有抢购业务,因此需要在负载均衡前端进行限流错误。本文同样也适用于防止CC.

  limit_req_zone $server_name zone=sname:10m rate=1r/s;        #限制服务器每秒只能有一次访问成功
    #limit_req_zone $binary_remote_addr zone=one:3m rate=1r/s;    #限制IP,每秒只能访问一次
    #limit_req_zone $binary_remote_addr $uri zone=two:3m rate=1r/s;  #限制IP和路径不带参数,
    #limit_req_zone $binary_remote_addr $request_uri zone=thre:3m rate=1r/s;  #限制IP和带参数的路径 

  server {
    listen    80;
    server_name www.abc.com;
    location / {
        include host/proxy.cnf;
        proxy_pass http://backend;
    }
    location /api/createOrder {
        limit_req zone=sname;  #不带突发,只能有一次正常请求
        limit_req_status 503;    #设置返回的状态码是503
        #limit_req zone=sname burst=5 nodelay;  #最大并发是5,并且实时处理
        include host/proxy.cnf;
        proxy_pass http://backend;
        error_page 503 =200 /50x.html;   #这里很重要,可以将错误的状态码503,返回结果的时候是200
    }
    location = /50x.html {
        if ($http_user_agent ~* "mobile|android|iPhone|iphone|ios|iOS"){
            #default_type application/json;
            return 200 '{"msg": "活动过于火爆,请稍后重试!","data": {},"code": -1}';  #设置移动端返回错误的信息显示
        }
        root  html;   #如果是PC端返回一个HTML页面
    }
    }

重点: 正常情况下,如果设置了限流,返回是503的状态码,这对于移动端来说即便是你返回JSON数据但是客户端时不认的,这个时候巧妙的通过 error_page 403 =200 /50x.html;将状态码设置为200

以上只是使用了ngx_limit_req_module,同时也可以使用ngx_limit_conn_module模块。

以上参考: https://gist.github.com/simlegate/75b18359316cc33d8e20

特别是一些咨询类网站如果备爬虫盯上,服务器可能会被爬虫给干死(小网站就是这样)
那么怎么办呢,我们可以使用变量去做

#全局配置
limit_req_zone $spider zone=spider:60m rate=200r/m;  #限制爬虫每分钟只能跑200次
#某个server中
limit_req zone=spider burst=5 nodelay;
if ($http_user_agent ~* “spider|bot”) {
  set $spider $http_user_agent;   #设置变量,进入这里的就进行限速
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Nginx对网段内ip的连接数限流配置详解

    Nginx中的所谓连接数限制,其实是tcp连接,也就是请求方通过三次握手后成功建立的连接状态.Nginx一般为我们提供了 ngx_http_limit_conn_module 模块来提供限制连接功能.该模块可以根据定义的键来限制每个键值的连接数,如同一个IP来源的连接数. ngx_http_limit_conn_module指令解释 Syntax: limit_conn zone number; Default: - Context: http, server, location 该指令描述会话

  • nginx 如何实现读写限流的方法

    nginx 读写限流 前段时间,开发了一个供外部调用的api,领导说要限流,请求单个IP,每秒50读次,写10次 万能的nginx,几行配置搞定 # 先定义好规则,需要写在server外面 limit_req_zone $binary_remote_addr $uri zone=api_write:20m rate=10r/s; # 写 limit_req_zone $binary_remote_addr $uri zone=api_read:20m rate=50r/s; # 读 # 把需要限

  • nginx限流方案的实现(三种方式)

    通过查看nginx官方文档,小弟查看到了三种nginx限流方式. 1.limit_conn_zone 2.limit_req_zone 3.ngx_http_upstream_module 前两种只能对客户端(即单一ip限流),并且文档也很全,但是经过测试发现,还是无法达到官方文档所说的结果(可能小弟的测试方法有问题). 这里先简单的介绍一下前两种: 1.limit_conn_zone 1.1nginx配置 http{ limit_conn_zone $binary_remote_addr zo

  • 一文搞懂Nginx限流(简单实现)

    Nginx现在已经是最火的负载均衡之一,在流量陡增的互联网面前,接口限流也是很有必要的,尤其是针对高并发的场景.Nginx的限流主要是两种方式:限制访问频率和限制并发连接数. 限流(rate limiting)是NGINX众多特性中最有用的,也是经常容易被误解和错误配置的,特性之一.该特性可以限制某个用户在一个给定时间段内能够产生的HTTP请求数.请求可以简单到就是一个对于主页的GET请求或者一个登陆表格的POST请求. 限流也可以用于安全目的上,比如减慢暴力密码破解攻击.通过限制进来的请求速率

  • 使用nginx实现分布式限流的方法

    1.前言 一般对外暴露的系统,在促销或者黑客攻击时会涌来大量的请求,为了保护系统不被瞬间到来的高并发流量给打垮, 就需要限流 . 本文主要阐述如何用nginx 来实现限流. 听说 Hystrix 也可以, 各位有兴趣可以去研究哈 . 2.首先部署一个对外暴露接口的程序 我这里部署的是一个spring boot 项目 里面暴露了如下接口, 很简单 暴露了一个 get 请求返回 hello world 的restful 接口. 将此程序部署到 linux 服务器上. 部署步奏不再赘述, 自行百度 s

  • Nginx源码研究之nginx限流模块详解

    高并发系统有三把利器:缓存.降级和限流: 限流的目的是通过对并发访问/请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务(定向到错误页).排队等待(秒杀).降级(返回兜底数据或默认数据): 高并发系统常见的限流有:限制总并发数(数据库连接池).限制瞬时并发数(如nginx的limit_conn模块,用来限制瞬时并发连接数).限制时间窗口内的平均速率(nginx的limit_req模块,用来限制每秒的平均速率): 另外还可以根据网络连接数.网络流量.CPU或内存负载等来限流. 1.限流算法 最

  • Nginx抢购限流配置实现解析

    因业务需求经常会有抢购业务,因此需要在负载均衡前端进行限流错误.本文同样也适用于防止CC. limit_req_zone $server_name zone=sname:10m rate=1r/s; #限制服务器每秒只能有一次访问成功 #limit_req_zone $binary_remote_addr zone=one:3m rate=1r/s; #限制IP,每秒只能访问一次 #limit_req_zone $binary_remote_addr $uri zone=two:3m rate=

  • 详解Nginx限流配置

    本文以示例的形式,由浅入深讲解Nginx限流相关配置,是对简略的官方文档的积极补充. Nginx限流使用的是leaky bucket算法,如对算法感兴趣,可移步维基百科先行阅读.不过不了解此算法,不影响阅读本文. 空桶 我们从最简单的限流配置开始: limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=10r/s; server { location /login/ { limit_req zone=ip_limit; proxy_p

  • sentinel 整合spring cloud限流的过程解析

    spring cloud基于http进行服务调用,大致过程如下: 服务提供端:提供http接口,并向服务中心注册服务信息 服务消费端:将服务端的http接口作为本地服务,从注册中心读取服务提供端信息,使用feign发起远程调用 相关依赖 <!-- 服务注册与发现 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibab

  • Java RPC框架如何实现客户端限流配置

    关键资源 关键资源总是有限的,也就意味着处理能力也有限,所以当面对大量业务时,为了保障自己能够有序的提供服务最经济的做法就是限制同一时间处理的事务数.比如银行的工作人员,一个工作人员同时只能为一个客户服务,来多了根本处理不了,不光是一种浪费而且有可以造成混乱的局面导致工作人员无法工作. 网络请求漏斗 越上层的服务器处理的事务越轻,应付请求的能力也越强,也就意味着同一请求越上层处理时间越短.为了有效的保护下层服务器,就需要对发送给下层的请求量做限流,在下层服务器可接受的范围内.否则就可能会出现下层

  • Nginx限流和黑名单配置的策略

    目录 1 背景介绍 2 Nginx 的限流策略 2.1 limit_req_zone限制访问频率 2.2 limit_conn_zone限制最大连接数 3 黑名单设置 1 背景介绍 为了防止一些抢票助手所发起的一些无用请求,我们可以使用 nginx 中的限流策略进行限流操作.常见的限流算法:计数器.漏桶算法.令牌桶算法 Java高并发系统限流算法的应用 从作用上来说,漏桶和令牌桶算法最明显的区别就是是否允许突发流量(burst)的处理,漏桶算法能够强行限制数据的实时传输(处理)速率,对突发流量不

随机推荐