在 Nginx 中限制同一 IP 的访问频率可以有效防止恶意请求或 DDoS 攻击。以下是几种配置方法:
这是最常用的方法,基于漏桶算法实现:
http {
# 定义限流区域,名为one,速率限制为每秒10个请求,突发不超过20个
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server {
location / {
# 应用限流规则
limit_req zone=one burst=20 nodelay;
# 其他配置...
}
}
}
参数说明:
- zone=one:10m
:定义名为"one"的共享内存区,大小为10MB
- rate=10r/s
:限制每秒10个请求
- burst=20
:允许突发20个请求
- nodelay
:不延迟处理突发请求,直接拒绝超过限制的请求
http {
# 定义连接限制区域,名为addr,大小10MB
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location / {
# 限制每个IP同时只能有10个连接
limit_conn addr 10;
# 其他配置...
}
}
}
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 5;
# 其他配置...
}
}
}
http {
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=2r/s;
server {
location = /login {
limit_req zone=api_limit burst=5;
# 其他配置...
}
}
}
http {
geo $limit {
default 1;
192.168.1.0/24 0; # 内网IP不限流
10.0.0.1 0; # 特定IP不限流
}
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 nodelay;
# 其他配置...
}
}
}
配置完成后,使用以下命令测试并重载Nginx:
sudo nginx -t # 测试配置是否正确
sudo nginx -s reload # 重载配置
可以使用工具如ab
(Apache Benchmark)或wrk
进行压力测试验证限流效果。