Nginx限速

     在WEB开发中经常会遇到接口被刷的情况,如CC攻击,通过有限的ip对服务器发来大量请求,使服务器资源耗尽。使用nginx的ngx_http_limit_req_module 模块和ngx_http_limit_conn_module模块可以对统一ip的请求和连接数进行限制。

 

1,ngx_http_limit_req_module模块,用来限制连单位时间内连接数的模块,是对一段时间内的连接数限制。设置一块共享内存限制域用来保存键值的状态参数

 语法: 

      limit_req_zone $variable zone=name:size rate=rate; 其中$variable是键,zone是区域名,limit_req会使用,size是内存大小,rate是连接数限制每秒/每分。

      limit_req zone=name [burst=number] [nodelay];设置对应的共享内存限制域和允许被处理的最大请求数阈值。 默认超过请求频率的请求会被延时处理,当超过阀值默认返回503。burst表示前一秒如未达到上线,其余量可以顺延给下一秒。nodelay表示不延时处理

      limit_req_status code 设置拒绝请求的响应状态码,默认不设置为503

举例:

      limit_req_zone $binary_remote_addr zone=addr_gift:10m rate=30r/s;

      limit_req zone=addr_gift nodelay;

      limit_req_status 403;

      统一IP平均处理的请求频率不能超过每秒30次,且不延时执行,超过上限的返回 403。

 

2,ngx_http_limit_conn_module模块,用来限制单个ip的并发连接数,是对同一时刻的连接数限制。

语法:

      limit_conn_zone $variable zone=name:size;$variable定义键,zone=name定义区域名称,size定义各个键共享内存空间大小。

      limit_conn zone_name number,指定每个给定键值的最大同时连接数,当超过这个数字时默认被返回503。

      limit_conn_status code; 。指定当超过限制时,返回的状态码。默认是503。

举例:

       limit_conn_zone $binary_remote_addr zone=addr_conn:10m; 

       limit_conn addr_conn 50;

       limit_conn_status 403;

       统一IP并发连接数50,超过限制返回403

Nginx 提供了多种限速方法和配置方式,以下是一些常见的限速配置: ### 基于速率的限速配置 #### 简单速率限制 可以通过 `limit_rate` 指令直接限制下载速度。例如,若要对所有请求进行限速,可在 `server` 块或 `location` 块中添加如下配置: ```nginx location / { limit_rate 100k; # 限定下载速度为 100k } ``` #### 按流量大小后限速 使用 `limit_rate_after` 和 `limit_rate` 结合,可实现先让一定流量通过,之后再进行限速。例如,对 `/upload/` 路径下的资源,流量超过 1000k 后开始限速: ```nginx location /upload/ { limit_rate_after 1000k; limit_rate 100k; } ``` 此配置针对该路径下的视频等资源,先让 1000k 流量通过,之后以 100k 的速度进行限速 [^1]。 ### 基于并发连接数的限速配置 #### 限制同一 IP 的并发连接数 通过 `limit_conn_zone` 和 `limit_conn` 指令,可限制同一 IP 的并发连接数。例如: ```nginx limit_conn_zone $binary_remote_addr zone=addr:10m; server { location /abc { limit_conn addr 1; # 限制同一 IP 并发为 1 limit_rate 100k; # 下载速度为 100K } } ``` 这里 `limit_conn_zone` 定义了一个存储会话状态的共享内存区域,`limit_conn` 用于指定每个 IP 的最大连接数 [^4]。 ### 针对突发请求的限速配置 使用 `limit_req_zone` 和 `limit_req` 指令可对突发请求进行限速。例如,每处理一次请求,对突发超过 5 个以后的请求放入缓存区: ```nginx http { limit_req_zone $binary_remote_addr zone=baism:10m rate=1r/s; server { location /search/ { limit_req zone=baism burst=5 nodelay; } } } ``` 其中 `limit_req_zone` 定义了一个请求速率限制区域,`limit_req` 用于应用这个速率限制 [^4]。 ### 流媒体视频流限速配置 对于流媒体视频流,可采用如下配置: ```nginx http { include mime.types; default_type application/octet-stream; server_tokens off; sendfile on; keepalive_timeout 65; limit_conn_zone $binary_remote_addr zone=addr:10m; server { listen 81; server_name localhost; charset utf-8; location / { root html; index index.html index.htm; } location /a { limit_conn addr 1; # 同一 IP 同一时间下载连接数 limit_rate 100k; # 下载最大速率 limit_rate_after 250m; # 下载到多少时开始限速 } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } ``` 在这个配置中,`/a` 路径下的视频下载,会限制同一 IP 同一时间只有 1 个下载连接,下载到 250m 时开始限速,最大下载速率为 100k [^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值