博客
关于我
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/

你可能感兴趣的文章
Netty源码—8.编解码原理二
查看>>
Netty源码解读
查看>>
netty的HelloWorld演示
查看>>
Netty的Socket编程详解-搭建服务端与客户端并进行数据传输
查看>>
Netty的网络框架差点让我一夜秃头,哭了
查看>>
Netty相关
查看>>
Netty简介
查看>>
Netty线程模型理解
查看>>
netty解决tcp粘包和拆包问题
查看>>
Netty速成:基础+入门+中级+高级+源码架构+行业应用
查看>>
Netty遇到TCP发送缓冲区满了 写半包操作该如何处理
查看>>
netty(1):NIO 基础之三大组件和ByteBuffer
查看>>
Netty:ChannelPipeline和ChannelHandler为什么会鬼混在一起?
查看>>
Netty:原理架构解析
查看>>
Network Dissection:Quantifying Interpretability of Deep Visual Representations(深层视觉表征的量化解释)
查看>>
Network Sniffer and Connection Analyzer
查看>>
Network 灰鸽宝典【目录】
查看>>
Networkx写入Shape文件
查看>>
NetworkX系列教程(11)-graph和其他数据格式转换
查看>>
Networkx读取军械调查-ITN综合传输网络?/读取GML文件
查看>>