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结合使用。