惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
博客园 - 聂微东
人人都是产品经理
人人都是产品经理
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园_首页
量子位
阮一峰的网络日志
阮一峰的网络日志
酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hackread – Cybersecurity News, Data Breaches, AI and More
云风的 BLOG
云风的 BLOG
D
DataBreaches.Net
B
Blog
L
LangChain Blog
Apple Machine Learning Research
Apple Machine Learning Research
Vercel News
Vercel News
博客园 - 三生石上(FineUI控件)
爱范儿
爱范儿
Microsoft Azure Blog
Microsoft Azure Blog
IT之家
IT之家
aimingoo的专栏
aimingoo的专栏
B
Blog RSS Feed
H
Help Net Security
The Cloudflare Blog
U
Unit 42

祈雨的笔记

安全多方计算MPC spark原理解析 kueue执行源码分析 spark on k8s执行源码分析 spark-operator源码解析 系统压测遇到的缓存击穿问题 我的世界PC与安卓联机 蚂蚁金服流量投放平台的AIG改造 G1大对象致Old区占用率高 日志打印导致接口响应率下跌分析 Groovy加载类导致OOM分析 ERROR日志打印导致CPU满载 记OceanBase死锁超时 应用发版期间服务响应超时 Ark Serverless初探 系统优化复盘一二三 The user specified as a definer does not exist Kong网关初探 API网关选型调研 CPU火焰图常用工具 配置中心选型调研 root操作Nginx导致用户组错误 基于Proxifier使用代理 FastJSON字段智能匹配踩坑 Nacos初探 记一次Nginx服务器CPU满荷载故障 基于券系统分库分表的思考 limit不参与SQL成本计算致索引失效 Linux常用性能监控命令 golang低版本http2偶现400
基于nginx的限流
祈雨的笔记 · 2018-12-10 · via 祈雨的笔记

limit_req

介绍

文档

nginx自带的ngx_http_limit_req_module是漏桶算法实现的请求限流模块。

示例配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
http {
# 区域名称为limit_ip,大小为10m,同一个请求IP限流为每秒1次请求
limit_req_zone $binary_remote_addr zone=limit_ip:10m rate=1r/s;
# 同一个后端URI限流为每秒10次请求
limit_req_zone $uri zone=limit_uri:10m rate=10r/s;
# 设置拒绝请求或延迟处理请求的日志级别
limit_req_log_level error;
# 设置拒绝请求的响应状态码
limit_req_status 503;
...

server {
...

location / {
limit_req zone=limit_ip burst=2 nodelay;
limit_req zone=limit_uri burst=20 nodelay;
root html;
index index.html index.htm;
}
}
}

说明

  • 如果请求被限流,则直接返回相应的错误码(默认503)
  • 如果没有配置桶容量burst,则桶容量为0,按照固定速率处理请求。超出固定速率处理的请求被限流
  • 如果配置了桶容量burst>0以及延迟模式(没有配置nodelay)。如果桶满了则新的请求被限流;如果没有满,则请求会以固定平均速率被处理
  • 如果配置了桶容量burst>0以及非延迟模式(配置nodelay),则不会按照固定速率处理请求,而是允许突发处理请求。如果桶满了,则请求被限流

注意

limit_req_zone key zone=name:size rate=rate [sync]中的限流对象key不建议修改,如果一定要修改限流对象key,务必作废原来的规则使用新的规则名称name。同一个name规则名称如果要切换限流对象keynginx -s reload软重启nginx并不会生效,需要将nginx进程彻底关闭nginx -s stop后重启才能生效!

测试

6个请求由6个线程执行,即等价于同时向nginx发起6个请求。

1
ab -n 6 -c 6 http://localhost/

limit_req zone=test

没有配置桶容量burst,则桶容量为0,按照固定速率处理请求:只有1个请求被处理,其余5个请求被拒绝。

1
2
3
4
5
6
127.0.0.1 - - [10/Dec/2018:10:22:38 -0500] "GET / HTTP/1.0" 200 612 "-" "ApacheBench/2.3"
127.0.0.1 - - [10/Dec/2018:10:22:38 -0500] "GET / HTTP/1.0" 503 537 "-" "ApacheBench/2.3"
127.0.0.1 - - [10/Dec/2018:10:22:38 -0500] "GET / HTTP/1.0" 503 537 "-" "ApacheBench/2.3"
127.0.0.1 - - [10/Dec/2018:10:22:38 -0500] "GET / HTTP/1.0" 503 537 "-" "ApacheBench/2.3"
127.0.0.1 - - [10/Dec/2018:10:22:38 -0500] "GET / HTTP/1.0" 503 537 "-" "ApacheBench/2.3"
127.0.0.1 - - [10/Dec/2018:10:22:38 -0500] "GET / HTTP/1.0" 503 537 "-" "ApacheBench/2.3"

limit_req zone=test burst=2

配置桶容量burst为2以及延迟模式(没有配置nodelay),按照固定速率处理请求:第1个请求被处理,2个请求被放置到缓冲区阻塞并按1r/s的速率处理,其余3个请求被拒绝。

1
2
3
4
5
6
127.0.0.1 - - [10/Dec/2018:10:23:16 -0500] "GET / HTTP/1.0" 200 612 "-" "ApacheBench/2.3"
127.0.0.1 - - [10/Dec/2018:10:23:16 -0500] "GET / HTTP/1.0" 503 537 "-" "ApacheBench/2.3"
127.0.0.1 - - [10/Dec/2018:10:23:16 -0500] "GET / HTTP/1.0" 503 537 "-" "ApacheBench/2.3"
127.0.0.1 - - [10/Dec/2018:10:23:16 -0500] "GET / HTTP/1.0" 503 537 "-" "ApacheBench/2.3"
127.0.0.1 - - [10/Dec/2018:10:23:17 -0500] "GET / HTTP/1.0" 200 612 "-" "ApacheBench/2.3"
127.0.0.1 - - [10/Dec/2018:10:23:18 -0500] "GET / HTTP/1.0" 200 612 "-" "ApacheBench/2.3"

limit_req zone=test burst=2 nodelay

配置桶容量burst为2以及非延迟模式(配置nodelay),不按照固定速率处理请求:第1个请求被处理,2个请求被放置到缓冲区后立即处理(不阻塞),其余3个请求被拒绝。

1
2
3
4
5
6
127.0.0.1 - - [10/Dec/2018:10:23:46 -0500] "GET / HTTP/1.0" 200 612 "-" "ApacheBench/2.3"
127.0.0.1 - - [10/Dec/2018:10:23:46 -0500] "GET / HTTP/1.0" 200 612 "-" "ApacheBench/2.3"
127.0.0.1 - - [10/Dec/2018:10:23:46 -0500] "GET / HTTP/1.0" 200 612 "-" "ApacheBench/2.3"
127.0.0.1 - - [10/Dec/2018:10:23:46 -0500] "GET / HTTP/1.0" 503 537 "-" "ApacheBench/2.3"
127.0.0.1 - - [10/Dec/2018:10:23:46 -0500] "GET / HTTP/1.0" 503 537 "-" "ApacheBench/2.3"
127.0.0.1 - - [10/Dec/2018:10:23:46 -0500] "GET / HTTP/1.0" 503 537 "-" "ApacheBench/2.3"

limit_rate

介绍

limit_rate

limit_rate_after

nginx自带的limit_rate可以控制单个连接的宽带。

示例配置

1
2
3
4
5
6
7
8
9
10
11
12
13
http {
...

server {
...
location /download {
# 用户下载达到10MB后,限速128KB/s
limit_rate_after 10m;
limit_rate 128k;
...
}
}
}

说明

  • limit_rate_after:下载指定的文件大小之后开始限速
  • limit_rate:最高下载速度