vlambda博客
学习文章列表

Nginx深度2-高并发限流落地实战

Nginx深度2-高并发限流落地实战

什么是限流

限流就是限制客户端有多少请求数量能够访问服务端。例如 1000个请求,只能有100个请求进行访问服务端。

目的:保证系统在高并发的情况下,保证系统的能够正常运行。

项目中为什么要使用限流

见图分析

项目中如何落地限流

条件

1、Nginx

2、ngx_http_limit_conn_module

3、jmeter

步骤

1、先在到Nginx到conf目录中,找到nginx.conf文件

  limit_conn_zone $server_name zone=perserver:10m;
server {
listen 8081;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;

location / {
limit_conn perserver 1;
proxy_pass https://localhost:5001;
}
}

2、然后使用jmeter进行访问,进行压测访问

缺陷:服务端被限制只能允许访问10个请求,那么就会限制请求数量进行访问,请求数可能来至于多个客户端,如果一个客户端都把请求数占用了。就会导致其他客户端无法进行请求,导致恶意攻击。

方案:对IP限流

Nginx对客户端进行IP限流

条件

1、Nginx

2、ngx_http_limit_conn_module

3、jmeter

步骤

1、先在到Nginx到conf目录中,找到nginx.conf文件

  limit_conn_zone $binary_remote_addr zone=remoteIp:10m;
   server {
       listen       8081;
       server_name  localhost; 
       #charset koi8-r;
       #access_log  logs/host.access.log  main;

    location / {
        limit_conn remoteIp 2;
        proxy_pass https://localhost:5001;
     }
   }

2、然后使用jmeter进行访问,进行压测访问

1048576 /32 = 32768个会话

缺陷:

1、如果客户端非常多,每个IP都限制请求处理1次,如果出现了100万个客户端,那么就有非常多的客户端徐亚需要进行处理,那么就会导致系统被压垮。所以,这个时候,就需要使用平滑处理

Nginx对客户端IP平滑限流

条件

1、Nginx

2、ngx_http_limit_req_module

3、jmeter

步骤

1、先在到Nginx到conf目录中,找到nginx.conf文件

   limit_req_zone $binary_remote_addr zone=addr:10m rate=2r/s;
   server {
       listen       8081;
       server_name  localhost; 
       #charset koi8-r;
       #access_log  logs/host.access.log  main;

    location / {
        limit_req zone=addr;
        proxy_pass https://localhost:5001;
     }
   }

2、然后使用jmeter进行访问,进行压测访问

2r/s 代表1s可以处理2个请求?怎么算的呢?1s ==1000ms ,意思是每500ms 处理一个请求。

缺陷:

1、如果客户端请求非常多,1s处理2个是 每500ms 处理一个,就会导致并发性能下降。这个时候把不能处理的,排除掉,然后再来处理。所以需要加缓存来处理。缓冲几个,以提升性能。

Nginx对客户端IP平滑限流-缓冲

条件

1、burst

步骤

1、先在到Nginx到conf目录中,找到nginx.conf文件

   limit_req_zone $binary_remote_addr zone=addr:10m rate=2r/s;
   server {
       listen       8081;
       server_name  localhost; 
       #charset koi8-r;
       #access_log  logs/host.access.log  main;

    location / {
        limit_req zone=addr burst=5;
        proxy_pass https://localhost:5001;
     }
   }

2、然后使用jmeter进行访问,进行压测访问

Nginx对客户端IP平滑限流-缓冲-并发处理

条件

1、nodelay

步骤

1、先在到Nginx到conf目录中,找到nginx.conf文件

   limit_req_zone $binary_remote_addr zone=addr:10m rate=2r/s;
   server {
       listen       8081;
       server_name  localhost; 
       #charset koi8-r;
       #access_log  logs/host.access.log  main;

    location / {
        limit_req zone=addr burst=5 nodelay;
        proxy_pass https://localhost:5001;
     }
   }

2、然后使用jmeter进行访问,进行压测访问

Nginx对客户端限速

条件

1、limit_rate

步骤

1、先在到Nginx到conf目录中,找到nginx.conf文件

  server {
       listen       8081;
       server_name  localhost; 
       #charset koi8-r;
       #access_log  logs/host.access.log  main;

    location / {
        limit_rate 512k;
        proxy_pass https://localhost:5001;
     }
   }

2、然后使用jmeter进行访问,进行压测访问

缺陷:每次请求都是直接限速的。

Nginx对客户端限速-间断

条件

1、limit_rate_after

步骤

1、先在到Nginx到conf目录中,找到nginx.conf文件

  server {
       listen       8081;
       server_name  localhost; 
       #charset koi8-r;
       #access_log  logs/host.access.log  main;

    location / {
        limit_rate_after 3m;
        limit_rate 512k;
        proxy_pass https://localhost:5001;
     }
   }

2、然后使用jmeter进行访问,进行压测访问

缺陷:任何请求都是512k下载,如果遇到多线程情况,那么就会出现,使用多线程下载,无法达到限速的目的,

这个时候可以和limit_conn_zone结合使用。

Nginx对客户端IP限速

条件

1、ngx_http_limit_conn_module

2、limit_conn_zone

步骤

1、先在到Nginx到conf目录中,找到nginx.conf文件

  limit_conn_zone $binary_remote_addr zone=remoteIp:10m;
  server {
       listen       8081;
       server_name  localhost; 
       #charset koi8-r;
       #access_log  logs/host.access.log  main;

    location / {
        limit_conn remoteIp 1;
        limit_rate_after 3m;
        limit_rate 512k;
        proxy_pass https://localhost:5001;
     }
   }

2、然后使用jmeter进行访问,进行压测访问

缺陷:任何请求都是512k下载,如果遇到多线程情况,那么就会出现,使用多线程下载,无法达到限速的目的,

这个时候可以和limit_conn_zone结合使用。

Nginx限流扩展

令牌桶算法

漏桶算法