首页 > 系统相关 >Nginx请求访问控制是怎样实现的

Nginx请求访问控制是怎样实现的

时间:2024-05-10 16:55:23浏览次数:18  
标签:... 令牌 请求 访问控制 Nginx 算法 limit 漏桶

首先来看下什么是漏桶算法和令牌桶算法
Nginx并不直接实现漏桶算法或令牌桶算法,但这些算法在控制网络流量和请求速率方面非常有用。这些算法通常在网络编程、API服务、负载均衡等领域中使用,以确保系统的稳定性和性能。

漏桶算法(Leaky Bucket)

* 漏桶算法用于限制数据的传输速率。它可以将请求看作是水流,而漏桶的出水速度则是处理请求的速度。
* 当请求到达时,它们被放入漏桶中。如果漏桶已满(即已达到最大处理速率),则新的请求会被拒绝或丢弃。
* 漏桶算法的一个缺点是它不能很好地处理突发流量。即使漏桶未满,当突发流量到达时,它也会受到限制。

令牌桶算法(Token Bucket)

* 令牌桶算法是另一种用于控制数据传输速率的算法。与漏桶算法不同,它允许一定程度的突发流量。
* 令牌桶以恒定的速率产生令牌,并将它们放入桶中。当请求到达时,它们需要消耗桶中的令牌才能被处理。
* 如果桶中有足够的令牌,即使突发流量到达,也可以被处理。然而,如果桶中没有令牌,请求将被拒绝或放入队列中等待。
* 令牌桶算法的优点是它可以更好地处理突发流量,同时仍然保持平均传输速率在所需范围内。

在Nginx中,虽然它没有直接实现这些算法,但你可以通过配置Nginx的限流模块(如ngx_http_limit_req_modulengx_http_limit_conn_module)来模拟这些算法的行为。这些模块允许你根据请求的速率或并发连接数来限制请求

例如,ngx_http_limit_req_module允许你设置请求的速率限制,并通过漏桶或令牌桶算法类似的方式来处理超出限制的请求。你可以指定一个“burst”值,该值表示在达到速率限制之前可以处理的额外请求数。这类似于令牌桶算法中的桶容量。

ngx_http_limit_req_module(限制请求) 配置实例

ngx_http_limit_req_module 允许你限制特定区域的请求处理速率。这通常用于保护后端服务器免受过多的请求。

以下是一个配置实例,其中限制了对 /api/ 路径下资源的请求速率:

http {
    # ... 其他配置 ...

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

    server {
        # ... 其他配置 ...

        location /api/ {
            limit_req zone=mylimit burst=5 nodelay;

            # ... 其他location配置 ...

            proxy_pass http://backend_servers;
        }
    }
}

在这个配置中:

  • limit_req_zone 指令定义了一个名为 mylimit 的共享内存区域,用于存储请求的状态。$binary_remote_addr 是用于区分请求的键(通常是客户端IP地址的二进制形式),zone=mylimit:10m 表示这个区域的大小是 10MB,rate=10r/s 表示每秒只允许 10 个请求。
  • limit_req 指令在 location 块中用于应用请求限制。zone=mylimit 引用之前定义的限制区域,burst=5 表示在达到速率限制后还可以再处理 5 个请求(这些请求会排队等待),nodelay 表示如果请求超过了速率限制和突发限制,则立即返回 503 错误,而不是等待。

ngx_http_limit_conn_module(限制连接数) 配置实例

ngx_http_limit_conn_module 用于限制来自单个 IP 地址的并发连接数。

以下是一个配置实例,其中限制了对 / 路径下资源的并发连接数:

http {
    # ... 其他配置 ...

    limit_conn_zone $binary_remote_addr zone=perip:10m;

    server {
        # ... 其他配置 ...

        location / {
            limit_conn perip 10;

            # ... 其他location配置 ...

            # 例如,代理到后端服务器
            proxy_pass http://backend_servers;
        }
    }
}

在这个配置中:

  • limit_conn_zone 指令定义了一个名为 perip 的共享内存区域,用于存储并发连接的状态。$binary_remote_addr 是用于区分连接的键(通常是客户端IP地址的二进制形式),zone=perip:10m 表示这个区域的大小是 10MB。
  • limit_conn 指令在 location 块中用于应用并发连接限制。perip 10 表示每个 IP 地址的并发连接数不能超过 10。

这两个模块都提供了保护 Nginx 服务器和后端服务器免受过多请求或连接的能力,从而提高系统的稳定性和性能。

标签:...,令牌,请求,访问控制,Nginx,算法,limit,漏桶
From: https://www.cnblogs.com/ydswin/p/18184839

相关文章

  • 升级Artalk评论至V2-8-3-解决Error-请求响应404
    记录升级Artalk评论至V2.8.3,并解决ArtalkErrorError:请求响应404,无法获取评论列表数据朗读全文Yourbrowserdoesnotsupporttheaudioelement.有什么用升级Artalk评论至V2.8.3解决ArtalkErrorError:请求响应404,无法获取评论列表数据心路历程Artalk配置的SMT......
  • 请求区别
    超文本传输协议(HTTP)的设计目的是保证客户机与服务器之间的通信。HTTP的工作方式是客户机与服务器之间的请求-应答协议。web浏览器可能是客户端,而计算机上的网络应用程序也可能作为服务器端。举例:客户端(浏览器)向服务器提交HTTP请求;服务器向客户端返回响应。响应包含关于请求的......
  • 在线htaccess换nginx工具
    htaccess换nginx工具为您提供htaccess与nginx在线转换,apache伪静态文件转为nginx重写规则,htaccess伪静态规则换nginx,apacheRewriteRule转rewrite,apache伪静态文件转nginx重写,apache转nginx重写规则,本工具支持所有的htaccess伪静态、基本的配置规则、重定向等转换为nginx。......
  • Linux nginx 玩转日志模块
    log_formatmain'$remote_addr-$remote_user[$time_local]"$request"''$status$body_bytes_sent"$http_referer"''"$http_user_agent""$http_x_forwarded_fo......
  • 网页根据屏幕宽度请求不同的CSS文件
    网页根据屏幕宽度请求不同的CSS文件前言:重在记录,可能出错。一、代码<!DOCTYPEhtml><htmllang="ch"> <head> <title>网页根据屏幕宽度请求不同的CSS文件</title> <linkid="desktop-style"media="onlyscreenand(min-width:960px)"type=&......
  • es请求方式调用
    Es基础关系:ElasticSearch->mysqlindex(索引)->数据库Documents(文档)->row(行)Fileds(字段)->column正排索引id内容,类似表格倒排索引:keywords:idsPostman访问实例创建索引:创建库ip/索引名请求路径:PUThttp://127.0.0.1:9200/shopping请求体:none成功:{ "ackn......
  • post请求下载文件,"Content-Type": "application/x-www-form-urlencoded",
    importaxiosfrom"axios";importqsfrom"qs";if(item.resourceName=="导出"){const[startTime="",endTime=""]=this.rangeTime||[];letparams={carNumber:this.carNu......
  • nginx之使用与配置教程
    nginx之使用与配置教程原文链接:https://blog.csdn.net/qq_35056891/article/details/134391217简介​nginx是一个高性能的http和反向代理的web服务器正向代理反向代理优点速度更快、并发更高:单次请求或者高并发请求的环境下,Nginx都会比其他Web服务器响应的速度......
  • Nginx随手笔记
    1Nginx安装 Nginx安装指令中调整格式后的命令./configure--prefix=/usr/local/nginx\--pid-path=/var/run/nginx/nginx.pid\--lock-path=/var/lock/nginx.lock\--error-log-path=/var/log/nginx/error.log\--http-log-path=/var/log/nginx/access.log\--with-http_gz......
  • JAVA_WEB复习之请求响应
    简单参数请求:原始的方法,我们需要通过servlet中提供的api,HttpServletRequest(请求对象),获取请求的相关信息。比如获取请求参数:当tomcat接收到请求时,它会把请求的信息封装httpservletrequest到对象中。而在Springboot的环境,原始的API进行了封装,接收参数的形式更加简单。如果是简单......