• 售前

  • 售后

热门帖子
入门百科

详解Nginx http资源哀求限制(三种方法)

[复制链接]
123457439 显示全部楼层 发表于 2021-10-26 13:10:57 |阅读模式 打印 上一主题 下一主题
前置条件:nginx 需要有 ngx_http_limit_conn_module 和 ngx_http_limit_req_module 模块,可以使用命令 2>&1 nginx -V | tr ' ' '\n'|grep limit 查抄有没有相应模块,假如没有请重新编译安装这两个模块。
测试版本为:nginx版本为1.15+

限定链接数

1.使用 limit_conn_zone 指令定义密钥并设置共享内存区域的参数(工作进程将使用此区域来共享密钥值的计数器)。第一个参数指定作为键盘算的表达式。第二个参数 zone 指定区域的名称及其巨细:
  1. limit_conn_zone $binary_remote_addr zone=addr:10m;
复制代码
2.在 location {} , server {} 大概 http {} 上下文中使用 limit_conn 指令来应用限定,第一个参数为上面设定的共享内存区域名称,第二个参数为每个key被答应的链接数:
  1. location /download/ {
  2. limit_conn addr 1;
  3. }
复制代码
使用 $binary_remote_addr 变量作为参数的时候,是基于 IP 地址的限定,同样可以使用 $server_name 变量举行给定服务器毗连数的限定:
  1. http {
  2. limit_conn_zone $server_name zone=servers:10m;
  3. server {
  4. limit_conn servers 1000;
  5. }
  6. }
复制代码
限定哀求速率

速率限定可用于防止 DDoS,CC 攻击,或防止上游服务器同时被太多哀求淹没。该方法基于 leaky bucket 漏桶算法,哀求以各种速率到达桶并以固定速率离开桶。在使用速率限定之前,您需要设置 "漏桶" 的全局参数:
      
  • key - 用于区分一个客户端与另一个客户端的参数,通常是变量  
  • shared memory zone - 保存这些密钥状态的区域的名称和巨细(即 "漏桶")  
  • rate - 每秒哀求数(r/s)或每分钟哀求数(r/m)("漏桶排空")中指定的哀求速率限定。每分钟哀求数用于指定小于每秒一个哀求的速率。
这些参数使用 limit_req_zone 指令设置。该指令在 http {} 级别上定义 - 这种方法答应应用差异的区域并哀求溢出参数到差异的上下文:
  1. http {
  2. #...
  3. limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
  4. }
复制代码
使用此设置,将创建巨细为 10m 字节,名称为 one 的共享内存区域。该区域保存使用 $binary_remote_addr 变量设置的客户端 IP 地址的状态。请留意, $remote_addr 还包罗客户端的 IP 地址,而 $binary_remote_addr 保存更短的 IP 地址的二进制体现。
可以使用以下数据盘算共享内存区域的最佳巨细: $binary_remote_addr IPv4 地址的值巨细为 4 个字节,64 位平台上的存储状态占用 128 个字节。因此,大约 16000 个 IP 地址的状态信息占用该区域的 1m 字节。
假如在 NGINX 需要添加新条目时存储空间耗尽,则会删除最旧的条目。假如释放的空间仍然不足以容纳新记录,NGINX 将返回 503 Service Unavailable 状态代码,状态码可以使用 limit_req_status 指令重新定义。
一旦该区域被设置,你可以使用 NGINX 设置中的任何地方使用 limit_req 指令限定哀求速率,尤其是 server {} , location {} 和 http {} 上下文:
  1. http {
  2. #...
  3. limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
  4. server {
  5. #...
  6. location /search/ {
  7.   limit_req zone=one;
  8. }
  9. }
  10. }
复制代码
使用如上设置,nginx 在 /search/ 路由下将每秒处理不超过 1 个哀求,延迟处理这些哀求的方式是总速率不大于设定的速率。NGINX 将延迟处理此类哀求,直到 "存储区"(共享存储区 one)已满。对于到达完备存储桶的哀求,NGINX 将响应 503 Service Unavailable 错误(当 limit_req_status 未自定义设定状态码时)。
限定宽带

要限定每个毗连的带宽,请使用以下 limit_rate 指令:
  1. location /download/ {
  2. limit_rate 50k;
  3. }
复制代码
通过此设置,客户端将能够通过单个毗连以最高 50k/秒 的速度下载内容。但是,客户端可以打开多个毗连跳过此限定。因此,假如目的是阻止下载速度大于指定值,则毗连数也应该受到限定。比方,每个 IP 地址一个毗连(假如使用上面指定的共享内存区域):
  1. location /download/ {
  2. limit_conn addr 1;
  3. limit_rate 50k;
  4. }
复制代码
要仅在客户端下载肯定数量的数据后施加限定,请使用该 limit_rate_after 指令。答应客户端快速下载肯定数量的数据(比方,文件头 - 电影索引)并限定下载其余数据的速率(使用户观看电影而不是下载)可能是公道的。
  1. limit_rate_after 500k;
  2. limit_rate 20k;
复制代码
以下示例体现了用于限定毗连数和带宽的组合设置。答应的最大毗连数设置为每个客户端地址 5 个毗连,这实用于大多数常见情况,由于现代浏览器通常一次最多打开 3 个毗连。同时,提供下载的位置只答应一个毗连:
  1. http {
  2. limit_conn_zone $binary_remote_address zone=addr:10m
  3. server {
  4. root /www/data;
  5. limit_conn addr 5;
  6. location / {
  7. }
  8. location /download/ {
  9.   limit_conn addr 1;
  10.   limit_rate_after 1m;
  11.   limit_rate 50k;
  12. }
  13. }
  14. }
复制代码
内容翻译自 nginx 哀求限定部分文档 ,稍微调解了一点语义。

以上就是本文的全部内容,盼望对大家的学习有所帮助,也盼望大家多多支持草根技术分享。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作