博客
关于我
Nginx配置限流,技能拉满!
阅读量:794 次
发布时间:2023-02-15

本文共 3154 字,大约阅读时间需要 10 分钟。

限流技术概述

限流(Rate Limitting)是一种服务降级的重要手段,其核心思想是通过限制系统的输入和输出流量,保护系统免受突发流量的冲击。以下将详细介绍限流的实现方法及其在Nginx中的应用。

1. 速率限制

在网络环境中,服务往往面临并发请求过大的问题。尤其是在公开服务器中,除了正常用户的访问,还可能遭受网络爬虫、大促、恶意攻击等多种突发流量。这些流量若超出服务器处理能力,可能导致响应延迟甚至系统崩溃。

1.1 Nginx限流方式

Nginx提供了两种主要的限流方式:

  • 限制请求速率:通过ngx_http_limit_req_module模块,使用漏桶算法(Leaky Bucket Algorithm)控制请求处理速率。这种方法类似于水桶的原理,水代表请求,桶代表请求队列,漏水代表请求处理,溢出则表示请求被拒绝。

  • 限制连接数:通过ngx_http_limit_conn_module模块,使用limit_conn指令限制单个IP或服务器的最大连接数。这种方式适用于防止连接洪水攻击。

此外,Nginx还支持下载/上传速度的限制,这在文件传输场景中尤为重要。

2. 限制请求速率

2.1 正常限流配置

在Nginx中,主要使用limit_req_zonelimit_req指令来配置限流。以下是一个简单的示例:

limit_req_zone $binary_remote_addr zone=test:10m rate=2r/s;server {    location / {        limit_req zone=test;    }}
  • limit_req_zone:用于定义限流对象,$binary_remote_addr是基于客户端IP的二进制存储变量,能够压缩内存占用。zone参数定义了共享内存区的大小和名称,rate参数设置了每秒的最大请求处理数(如2r/s表示每500ms处理一个请求)。

  • limit_req:用于实际限制请求处理速率,zone指定使用的限流区域,burst参数允许在速率限制之外额外处理的请求数,nodelay则表示不延迟处理。

2.2 处理突发流量

在面对突发流量时,仅设置rate参数并不能满足需求。可以通过增加burst参数来缓冲请求。以下是一个burst=5的配置示例:

limit_req_zone $binary_remote_addr zone=test:10m rate=2r/s;server {    location / {        limit_req zone=test burst=5;    }}

此时,若同时有10个请求,Nginx会处理第一个请求,其余9个请求会被拒绝。随后,每隔500ms从队列中取出一个请求处理。

为了进一步优化,可以结合nodelay参数,使请求立即处理:

limit_req_zone $binary_remote_addr zone=test:10m rate=2r/s;server {    location / {        limit_req zone=test burst=5 nodelay;    }}

此时,队列中的请求会立即处理,但长期吞吐量仍由rate决定。

2.3 设置白名单

对于不需要限流的场景(如测试或特定IP段),可以使用Nginx的geomap模块创建白名单。以下是一个白名单配置示例:

geo $limit {    default 1;    10.0.0.0/8 0;    192.168.0.0/24 0;}map $limit $limit_key {    0 "";    1 $binary_remote_addr;}limit_req_zone $limit_key zone=mylimit:10m rate=2r/s;

此配置会对白名单内的IP地址取消限流。

2.4 限制重复配置

在同一个location下,可以配置多个limit_req指令,这些指令会叠加作用。以下是一个多重限流配置示例:

geo $limit {    default 1;    10.0.0.0/8 0;    192.168.0.0/24 0;}map $limit $limit_key {    0 "";    1 $binary_remote_addr;}limit_req_zone $limit_key zone=mylimit:10m rate=2r/s;limit_req_zone $binary_remote_addr zone=myLimit2:10m rate=10r/s;server {    location ~*.html {        limit_req zone=mylimit burst=5 nodelay;        limit_req zone=myLimit2 burst=5 nodelay;    }}

此配置会对不同IP地址应用不同的限流规则。

3. 限制连接数

3.1 配置示例

以下是一个限制单个IP同时连接数的配置示例:

limit_conn_zone $binary_remote_addr zone=perip:10m;limit_conn perip 10;server {    location ~*.html {        limit_conn perip 10;        limit_conn perserver 100;    }}
  • limit_conn perip 10:限制单个IP的最大连接数为10。
  • limit_conn perserver 100:限制虚拟主机的总连接数为100。

4. 上传/下载速率限制

4.1 基本使用

server {    location / {        limit_rate 4k;    }}

此配置将每个连接的上传/下载速率限制为4k字节/秒。

4.2 动态限速

通过limit_rate_after可以实现动态限速:

server {    location / {        limit_rate_after 500k;        limit_rate 4k;    }}

此配置表示前500k字节不限速,超过后限速为4k字节/秒。

4.3 代理限速

proxy_limit_rate 10k;

此配置限制nginx与后端服务器之间的连接速率为10k字节/秒,需结合proxy_buffering启用。

4.4 动态限速示例

以下是一个基于时间动态限速的示例:

map $date_local $limit_rate_time {    default 4K;    ~(00:|01:|02:|03:|04:|05:|06:|07:).*:.* 16K;    ~(08:|12:|13:|18:).*:.* 8K;    ~(19:|20:|21:|22:|23:).*:.* 16K;}limit_rate $limit_rate_time;

此配置根据时间段动态调整限速。

另一个基于变量的动态限速示例:

map $cookie_User $limit_rate_cookie {    gold 64K;    silver 32K;    copper 16K;    iron 8K;}limit_rate $limit_rate_cookie;

此配置根据客户端 cookie 值动态调整限速。

通过以上方法,可以灵活配置Nginx的限流策略,充分保障服务器的稳定性和性能。

转载地址:http://rujfk.baihongyu.com/

你可能感兴趣的文章
NetBeans IDE8.0需要JDK1.7及以上版本
查看>>
netbeans生成的maven工程没有web.xml文件 如何新建
查看>>
netcat的端口转发功能的实现
查看>>
netfilter应用场景
查看>>
netlink2.6.32内核实现源码
查看>>
netmiko 自动判断设备类型python_Python netmiko模块的使用
查看>>
NetMizer-日志管理系统 dologin.php SQL注入漏洞复现(XVE-2024-37672)
查看>>
Netpas:不一样的SD-WAN+ 保障网络通讯品质
查看>>
NetScaler的常用配置
查看>>
netsh advfirewall
查看>>
NETSH WINSOCK RESET这条命令的含义和作用?
查看>>
netstat命令用法详解
查看>>
Netstat端口占用情况
查看>>
Netty 4的内存管理:sun.misc.Unsafe
查看>>
Netty channelRegistered\ChannelActive---源码分析
查看>>
Netty WebSocket客户端
查看>>
netty 主要组件+黏包半包+rpc框架+源码透析
查看>>
Netty 异步任务调度与异步线程池
查看>>
Netty中实现多客户端连接与通信-以实现聊天室群聊功能为例(附代码下载)
查看>>
Netty中集成Protobuf实现Java对象数据传递
查看>>