Nginx提供了几种限速机制,可以根据不同需求选择合适的方式。以下是主要的限速实现方法:
使用limit_req_zone
和limit_req
指令实现请求速率限制:
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server {
location / {
limit_req zone=one burst=20;
# 其他配置...
}
}
}
zone=one:10m
:创建名为"one"的共享内存区,大小为10MBrate=10r/s
:限制每秒10个请求burst=20
:允许突发20个请求限制单个IP的并发连接数:
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location / {
limit_conn addr 5;
# 其他配置...
}
}
}
zone=addr:10m
:创建名为"addr"的共享内存区limit_conn addr 5
:每个IP最多5个并发连接限制单个连接的下载速度:
location /download/ {
limit_rate 50k; # 限制为50KB/s
# 或者根据条件动态设置
limit_rate_after 500k; # 下载500KB后开始限速
limit_rate 100k; # 限速为100KB/s
}
http {
# 定义限速区域
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=5r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
location /api/ {
# 请求速率限制
limit_req zone=req_limit burst=10 nodelay;
# 并发连接限制
limit_conn conn_limit 10;
# 带宽限制
limit_rate 100k;
}
location /download/ {
# 大文件下载限速
limit_rate_after 1m;
limit_rate 50k;
}
}
}
可以为特定IP或网段设置不限速:
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=req_limit:10m rate=5r/s;
server {
location / {
limit_req zone=req_limit burst=10;
}
}
以上方法可以单独或组合使用,根据实际业务需求选择合适的限速策略。