Nginx-限流限速

1、基础

1.1、为什么要限速?

限制某个用户在一定时间内能够产生的Http请求。或者说限制某个用户的下载速度。

1.2、限速应用场景以及模块

1、下载限速:限制用户下载资源的速度,
使用Nginx模块:ngx_http_core_module。

2、请求限制︰限制用户单位时间内所产生的Http请求数,
使用Nginx模块:ngx_http_limit_req_module。

3、连接限制:限制同一时间的连接数,及并发数限制。
使用Nginx模块:ngx_http_limit_conn_module

2、实战

2.1、限制下载速度

2.1.1、配置nginx

cat >/etc/nginx/conf.d/mirror.cyc.com.conf <<'EOF'
server{
  listen 80;
  server_name mirror.cyc.com;
  charset utf-8; 
  root /mnt/;

  limit_rate_after 1m; # 当到达1m的时间,开始限速,速度为:100k/s
  limit_rate       100k;

  location /cdrom {
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;
  }
  location / {
    index index.html;
  }
}
EOF

2.1.2、重新加载nginx

systemctl reload nginx

2.1.3、测试效果

 

2.2、限制单位时间内所产生的Http请求数

2.2.1、需求

基于来源IР对下载速率限制,限制每秒处理1次请求,但可以突发超过3个请求放入缓存区

2.2.2、配置nginx

cat >/etc/nginx/conf.d/mirror.cyc.com.conf <<'EOF'
limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
server{
  listen 80;
  server_name mirror.cyc.com;
  charset utf-8; 
  root /mnt/;
  location /cdrom {
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;
    limit_req zone=req_one burst=3 nodelay;
  }
  location / {
    index index.html;
  }
}
EOF 

2.2.3、配置解析

# http
limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
#第一个参数: $binary_remote_addr 表示通过这个标识来做限制,限制同一客户端ip地址。
#第二个参数: zone=req_one:10m 表示生成一个大小为10M,名为req_one的内存区域,用来存储访问的频次信息。
#第三个参数: rate=1r/s 表示允许相同标识的客户端的访问频次,这里限制的是每秒1次。

# server
limit_req zone=req_one burst=3;
#第一个参数: zone=req_one设置使用哪个配置区域来做限制,与上面Limit_req_zone 里的name对应。
#第二个参数: burst=3,设置一个大小为3的缓冲区,当有大量请求过来时,超过了访问频次限制的请求可以先放到这个缓冲区内。
#第三个参数: nodelay,超过访问频次并且缓冲区也满了的时候,则会返回503,如果没有设置,则所有请求会等待排队。

2.2.4、访问测试

刷新太快,则返回503

2.3、限制客户端同一时刻的并发连接数

2.3.1、需求

设置共享内存区域和给定键值的最大允许个连接数。超过此限制时,服务器将返回503错误以回复请求

2.3.2、配置nginx

]# cat /etc/nginx/conf.d/mirror.cyc.com.conf 
limit_conn_zone $binary_remote_addr zone=addr_conn:10m;
server{
  listen 80;
  server_name mirror.cyc.com;
  charset utf-8; 
  root /mnt/;
  location /cdrom {
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;
    limit_conn addr_conn 2;
  }
  location / {
    index index.html;
  }
}

2.3.3、重新加载nginx

systemctl reload nginx

2.4、综合案例

2.4.1、需求

限制web服务器请求数处理为1秒一次,触发值为5、限制用户仅可同时下载一个文件。当下载超过10OM则限制下载速度为500k。如果同时下载超过2个视频,则返回提示"请联系管理员进行会员充值"

2.4.2、配置nginx

cat >/etc/nginx/conf.d/mirror.cyc.com.conf <<'EOF'
limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
limit_conn_zone $binary_remote_addr zone=addr_conn:10m;
server{
  listen 80;
  server_name mirror.cyc.com;

  charset utf-8; 
  root /mnt/;

  limit_req zone=req_one burst=5 nodelay;
  limit_conn addr_conn 1;
  limit_rate_after 100m;
  limit_rate       500k;

  location /cdrom {
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;
  }

  error_page 503 @errpage;
  location @errpage {
    default_type text/html;
    return 200 '提示:请联系管理员进行会员充值';
  }
  location / {
    index index.html;
  }
}
EOF

2.4.3、重新加载nginx

systemctl reload nginx

2.4.4、测试访问

访问过频率的时候,503页面

 

 

posted @ 2023-04-27 16:54  小粉优化大师  阅读(392)  评论(0编辑  收藏  举报