Nginx配置限流,技能拉满!
发布日期:2025-04-20 23:34:49 浏览次数:4 分类:精选文章

本文共 3222 字,大约阅读时间需要 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的限流策略,充分保障服务器的稳定性和性能。

上一篇:Nginx配置静态代理/静态资源映射时root与alias的区别,带前缀映射用alias
下一篇:Nginx配置负载均衡到后台网关集群

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2025年04月01日 04时48分21秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章