使用 Nginx 限流
作者&投稿:夕哈 (若有异议请与网页底部的电邮联系)
Nginx使用的限流算法是漏桶算法。
(1)安装Nginx。
如果你的Linux是Ubuntu或Debian,使用apt-get安装,在命令行中输入以下命令:
如果是CentOS,使用yum安装,在命令行中输入以下命令:
(2)找到Nginx所使用的配置文件所在的位置。在Ubuntu和Debian是在如下位置:
而CentOS则是在如下位置:
(3)在http块中,配置基础的限流配置:
其中4到8行定义的是一个服务器接口。而第2行和第6行配合完成了一个限流设置,下面解释一下这两行做的事情:
limit_req_zone命令在Nginx的配置文件中专门用于定义限流,它必须被放在http块中,否则无法生效,因为该命令只在http中被定义。
该字段包含三个参数:
第一个参数,就是键(key),即值$binary_remote_addr所在的位置,它代表的是我们的限流系统限制请求所用的键。
此处,我们使用了$binary_remote_addr,它是Nginx内置的一个值,代表的是客户端的IP地址的二进制表示。因此换言之,我们的示例配置,是希望限流系统以客户端的IP地址为键进行限流。
对Nginx有经验的读者可能还知道有一个Nginx内置值为binary_remote_addr是Nginx的社区推荐用值,因为它是二进制表达,占用的空间一般比字符串表达的$remote_addr要短一些,在寸土寸金的限流系统中尤为重要。
第二个参数是限流配置的共享内存占用(zone)。为了性能优势,Nginx将限流配置放在共享内存中,供所有Nginx的进程使用,因为它占用的是内存,所以我们希望开发者能够指定一个合理的、既不浪费又能存储足够信息的空间大小。根据实践经验,1MB的空间可以储存16000个IP地址。
该参数的语法是用冒号隔开的两个部分,第一部分是给该部分申请的内存一个名字,第二部分是我们希望申请的内存大小。
因此,在该声明中,我们声明了一个名叫mylimit(我的限制)的内存空间,然后它的大小是10M,即可以存储160000个IP地址,对于实验来说足够了。
第三个配置就是访问速率(rate)了,格式是用左斜杠隔开的请求数和时间单位。这里的访问速率就是最大速率,因此10r/s就是每秒10个请求。通过这台Nginx服务器访问后端服务器的请求速率无法超过每秒10个请求。
注意到第5行声明了一个资源位置/test/,因此我们第6行的配置就是针对这个资源的,通俗地说,我们在第6行的配置是针对特定API的,这个API就是路径为/test/的API,而其真正路径就是第8行声明的 http://backend 。注意,这个URL是不存在的,实际操作中,读者需要将它换成你已经开发好的业务逻辑所在的位置,Nginx在这里的作用只是一个反向代理,它自己本身没有资源。
第6行中,我们使用limit_req命令,声明该API需要一个限流配置,而该限流配置所在位置(zone)就是mylimit。
这样一来,所有发往该API的请求会先读到第6行的限流配置,然后根据该限流配置mylimit的名称找到声明在第2行的参数,然后决定该请求是否应该被拒绝。
但是这样还不够。不要忘了,Nginx使用的漏桶算法,不是时间窗口算法,我们前文介绍中说过,漏桶算法是有两个参数可以配置的!
(4)配置峰值。Nginx漏桶算法的峰值属性在API中设置。参数名为burst。如下:
在第6行中,我们只需要在声明limit_req的同时,指定burst就可以了,此处我们指定burst为20,即漏桶算法中我们的“桶”最多可以接受20个请求。
这样一个Nginx的限流系统就配置完毕了,但实际操作中,我们还可能需要很多别的功能,下面笔者就介绍几个很有用的配置技巧。
相对于传统的漏桶算法慢吞吞地转发请求的缺陷,Nginx实现了一种漏桶算法的优化版,允许开发者指定快速转发,而且还不影响正常的限流功能。开发者只需要在指定limit_req的一行中指定burst之后指定另一个参数nodelay,就可以在请求总数没有超过burst指定值的情况下,迅速转发所有请求了。如下所示:
您可能会担忧:这种情况下,会不会出现所有请求都被快速转发,然后接下来又有没有超过burst数量的请求出现,再次被快速转发,就好像固定窗口算法的漏洞一样,从而超过我们本来希望它能限制到的上限数量呢?答案是不会。Nginx的快速转发是这样实现的:
举例而言,配置如上所示,假如在某个瞬时有25个请求进入系统,Nginx会先转发20个(或21个,取决于瞬时情况),然后拒绝剩下的4个请求,并将当前桶中数量标为0,然后接下来的每100毫秒,缓慢恢复1个空位。
这样我们可以看到,Nginx既做到了快速转发消息,又不会让后端服务器承担过多的流量。
限流系统会提前拒绝请求,因此,我们在业务服务器上是肯定看不到这些请求的。假如我们收到一个报告说某用户在使用网站的时候出现错误,但是我们在业务服务器上又找不到相关的日志,我们如何确定是不是限流造成的呢?
只有限流系统的日志才能说明问题。因此,我们需要Nginx打印出它拒绝掉的请求的信息。但同时,Nginx打印的限流日志默认是错误(error),如果我们设置了一个基于日志错误扫描的警报,它扫到的限流错误,真的是我们希望给自己发警报的情况吗?
配置请求的位置就在资源中,使用的命令是limit_req_log_level,如下:
在第7行中,我们将Nginx的日志改为了警告(warn)。
限流的HTTP标准响应状态码是429,但是如果读者拿上述的配置文件直接去测试,会发现Nginx返回的是503(服务不可用)。到底应该返回什么状态码,是一个偏程序哲学的问题,此处我们不讨论,我们只讨论:如何让Nginx返回我们指定的状态码?
答案也是在同一个资源中,它的配置命令是limit_req_status,然后我们指定它为429即可:
除了以上功能以外,Nginx还支持很多复杂先进的限流功能,可以访问 https://docs.nginx.com/nginx/admin-guide/security-controls/controlling-access-proxied-http/ 作进一步的了解。
牧软异环: 在nginx的server中配置limit_rate相关,根据个人需求进行详细配置.注:通过limit_rate可以限制读写的流量.
泾县13575415750: 如何设置DLINK的流量限制 - ?
牧软异环: 进入路由器的“高级(进阶设定)”的流量控管页面. 流量控制默认是关闭的,首先勾选启用流量控管.WAN端口带宽填入我们申请的宽带的带宽数量,注意,这里带宽单位填写的KBps.IP地址段:填写IP地址段时,既可以设置为单个IP地址...
泾县13575415750: nginx能否按用户的网段来限速?怎么配置? - ?
牧软异环: 在一般的可管理交换机或路由器上都可以按策略进行流量管理.但是在低端设备上是没有这个功能的.不知你问的是什么意思,而且你的网络例子让人一看就知道你不是搞网络的.
泾县13575415750: nginx怎么实现单应用的并发连接数限制啊??是面向应用的~~~求高手指点~~!! - ?
牧软异环: server {.........location / {limit_conn linuxtone 1;limit_rate 10k;}........} 只允许客服端一个线程,每个10K.
泾县13575415750: 如何配置iptables与tc限制带宽和流量 - ?
牧软异环: 目前限速已经可以实现,但是限连接数由于iptables测connlimit模块不存在无法限速,hashlimit模块不正常也没法使用 限速脚本:#!/bin/sh# 定义进出设备(IDEV 内网接口,ODEV外网接口) IDEV="br-lan" ODEV="pppoe-wan"# 定义总...
泾县13575415750: 限制流量怎么设置? - ?
牧软异环: 小包优先:小包通常指小于64K的包,如:ping包.请求包、响应包等.在上网过程中.会出现很多请求,响应.这些包优先后,给我们的感觉就会快很多.IP/网段优先:可针对源IP、目的IP.或者段来设置优先级别.比如.局域网中.我首先...
泾县13575415750: 同事在局域网下载东西 弄的网络很卡 我想搞个软件 限制流量或者限制下载 用什么软件好? - ?
牧软异环: 可以用P2P终结者 使用方法:(1)首先在软件设置里把你的网卡和p2p终结者绑定,然后保存设置. (2)在网络控制台启动网络服务 (3)在网络主机扫描里就可以看到所以在线的主机,这时候你要控制那台就右健点,然后是设置选中主机公网带宽限制,在这里你可以设置你想要让他下载多少,很上传多少,一般都控制在50K左右.当然了也可以让对方断网. (4)在网络带宽管理这里把启用主机公网带宽限制前面的钩起来,保存设置,这样才可以控制对方 (5)就是在网络应用管理这里你可以控制对方下载和不让对方进某个网站. 具体的就是这些了,但是也不要限的太厉害了,否则会被对方发现
泾县13575415750: 在使用ccproxy代理给同事上网,想请问怎样限制同事电脑的流量,让他只能上qq,不能浏览网页.急! - ?
牧软异环: 可以设.首先要限制代理权限,才有可能:CCPROXY 选项里设成 帐号---> 部分允许 , 并在 帐号--->新建 里 把他的内网IP输进来,就可设 最大连接数,流量等;让他只上QQ, 在选项里把 DNS的勾子去掉,没有了DNS,他的网页 就上不了,或 把https的端口808关掉,只开放 sock5端口1080,可以初步防他不上IE.
泾县13575415750: 高科路由器怎么设置流量限制 - ?
牧软异环: 路由器限制流量方法:只能限制dhcp列表里面的用户流量.1、进入路由器:打开浏览器-输入192.168.1.1(一般路由器地址是这个)进路由-输入用户名,密码 ,(默认一般是admin).2、输入正确的用户名和密码进入路由器管理后台.3、我...
泾县13575415750: 交换机如何限制流量 - ?
牧软异环: 高档的交换机才可以,ACL或者接口上设置