• nginx 如何根据IP做限流,以及 nginx 直接返回 json 格式数据


    Nginx 限流配置 

    Nginx是如何限流的。随着业务的扩散,系统并发越来越高时,有三样利器用来保护系统,分别是缓存、降级和限流。 

    随着业务的扩散,系统并发越来越高时,有三样利器用来保护系统,分别是缓存、降级和限流。

    缓存:缓存是现在系统中必不可少的模块,并且已经成为了高并发高性能架构的一个关键组件,缓存的目的是提升系统访问速度和增大系统处理容量。

    降级:这个在天猫双 11 的时候非常常见,降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问题解决后再打开。

    限流:限流的目的是通过对并发访问 / 请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理


    nginx中设置参数:limit_req_zone 

    1.1 定义:用于限制单一的 IP 地址的请求的处理速率,即速率限制。

    1.2 使用方法

        在 http 中添加: limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

    第一个参数:$binary_remote_addr 表示通过remote_addr这个标识来做限制,“binary_”的目的是缩写内存占用量,是限制同一客户端ip地址。

    第二个参数:zone=one:10m 表示生成一个大小为10M,名字为one的内存区域,用来存储访问的频次信息。

    第三个参数:rate=1r/s表示允许相同标识的客户端的访问频次,这里限制的是每秒1次,还可以有比如30r/m的。

    在 server 中添加: limit_req zone=one burst=5 nodelay;
     

    第一个参数:zone=one 设置使用哪个配置区域来做限制,与上面limit_req_zone 里的name对应。

    第二个参数:burst=5,重点说明一下这个配置,burst爆发的意思,这个配置的意思是设置一个大小为5的缓冲区当有大量请求(爆发)过来时,超过了访问频次限制的请求可以先放到这个缓冲区内。

    第三个参数:nodelay,如果设置,超过访问频次而且缓冲区也满了的时候就会直接返回503,如果没有设置,则所有请求会等待排队。
     

    1.3 测试效果

    我们先来个未配置 nginx 限流的 ab 压测结果.

    限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务,

    以防止非预期的请求对系统压力过大而引起的系统瘫痪(友好点比如直接返回相应的 json 或则页面提示用户访问高峰,稍后再试)

    限流一般有三种:计数器 、漏桶算法、令牌桶算
     

    关于限流算法不是本文讨论范围,定义网上有大把介绍

    1. 先说下 nginx 里面配置直接返回 json 如何操作。

        location /json/ {
            default_type application/json;
            add_header Content-Type 'text/html; charset=utf-8';
            return 200 '{"code":"6666,"msg":"访问高峰期..."}';
            }


    Nginx 限流配置案例

    #限流
    limit_req_zone $binary_remote_addr zone=myRateLimit:10m rate=2r/s;

    location / { 
                #限流
                limit_req zone=myRateLimit burst=2 nodelay;
                root   html;
                index  index.html index.htm;
      }
            
    名词解释:

    第 1 个参数:limit_req_zone 定义在 http 块中,$binary_remote_addr 表示保存客户端 IP 地址的二进制形式。

    第 2 个参数:Zone 定义 IP 状态及 URL 访问频率的共享内存区域。zone=keyword 标识区域的名字,以及冒号后面跟区域大小。16000 个 IP 地址的状态信息约 1MB,所以示例中区域可以存储 160000 个 IP 地址。

    第 3 个参数:Rate 定义最大请求速率。示例中速率不能超过每秒 2 个请求。

    超过限流,默认返回 503 状态。

    然后我们在 503 错误页面配置返回相应 json 或者 html 页面即可。这里我们返回 json

    error_page 503 /503;

        location = /503 {
                default_type application/json;
                add_header Content-Type 'text/html; charset=utf-8';
                return 200 '{"code":"6666,"msg":"访问高峰期..."}';
        }
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            

  • 相关阅读:
    《苍穹外卖》知识梳理6-缓存商品,购物车功能
    java面试题第七天
    Wireshark抓包工具配置以及MQTT抓包分析
    网页设计期末课程大作业:基于HTML+CSS+JavaScript+Bootstrap制作响应式网站信息技术交流博客(7页)
    NXP iMX6ULL核心板框架图|软硬件|功能功耗|原理图的规格书资料
    redis解决分布式session问题
    【第四阶段】kotlin语言集合转换与快捷转换学习
    Ubuntu18.04创建用户缺少默认的下载、桌面目录
    基于51单片机的波形发生器proteus仿真数码管LCD12864显示
    精准配置无线接入点发射功率
  • 原文地址:https://blog.csdn.net/happyzhlb/article/details/134459587