Nginx提供了多种模块来实现请求限速和流量控制,可以有效防止服务器被过多请求压垮或带宽被耗尽。以下是主要的实现方法:
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server {
location /api/ {
limit_req zone=one burst=20 nodelay;
proxy_pass http://backend;
}
}
}
limit_req_zone
定义共享内存区域和速率限制
$binary_remote_addr
使用客户端IP作为限制键zone=one:10m
创建名为"one"的10MB共享内存区rate=10r/s
限制每秒10个请求limit_req
应用限制规则
burst=20
允许突发20个请求nodelay
立即处理突发请求而不延迟http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location /download/ {
limit_conn addr 5;
limit_rate 100k;
}
}
}
limit_conn_zone
定义共享内存区域limit_conn addr 5
限制每个IP最多5个并发连接limit_rate 100k
限制每个连接的下载速度为100KB/slocation /download/ {
limit_rate 500k; # 限制每个连接500KB/s
limit_rate_after 10m; # 前10MB不限速
}
geo $limited {
default 0;
192.168.1.0/24 1;
10.0.0.0/8 1;
}
map $limited $limit_key {
0 "";
1 $binary_remote_addr;
}
limit_req_zone $limit_key zone=req_zone:10m rate=5r/s;
http {
# 定义不同区域的限速规则
limit_req_zone $binary_remote_addr zone=api_slow:10m rate=2r/s;
limit_req_zone $binary_remote_addr zone=api_fast:10m rate=20r/s;
limit_conn_zone $binary_remote_addr zone=api_conn:10m;
server {
location /api/v1/slow {
limit_req zone=api_slow burst=10;
limit_conn api_conn 2;
proxy_pass http://backend;
}
location /api/v1/fast {
limit_req zone=api_fast burst=50;
limit_conn api_conn 10;
proxy_pass http://backend;
}
}
}
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_zone:10m rate=5r/s;
error_page 429 /too_many_requests;
error_page 503 /service_unavailable;
location = /too_many_requests {
internal;
return 429 '{"error": "Too many requests"}';
}
location = /service_unavailable {
internal;
return 503 '{"error": "Service temporarily unavailable"}';
}
通过合理配置这些限速和流量控制功能,可以有效保护您的服务器资源,防止恶意攻击或突发流量导致的服务不可用。