Nginx提供了多种限流机制来控制客户端请求速率,保护服务器不被过度请求压垮。以下是主要的限流配置方法:
使用limit_req_zone
和limit_req
指令实现:
http {
# 定义限流区域(10MB内存空间,平均每秒处理1个请求)
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
location /api/ {
# 应用限流规则
limit_req zone=one burst=5;
# burst=5表示允许突发5个请求排队等待
# nodelay表示不延迟处理,直接拒绝超出限制的请求
proxy_pass http://backend;
}
}
}
使用limit_conn_zone
和limit_conn
指令限制并发连接数:
http {
# 定义连接数限制区域(10MB内存空间)
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location /download/ {
# 每个IP最多5个并发连接
limit_conn addr 5;
# 限制下载速度(50KB/s)
limit_rate 50k;
}
}
}
限制客户端下载速度:
location /download/ {
# 限制单个连接速度为50KB/s
limit_rate 50k;
# 前10MB不限速
limit_rate_after 10m;
}
可以设置某些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_zone:10m rate=5r/s;
可以结合多个限流规则:
http {
limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
limit_req_zone $server_name zone=perserver:10m rate=100r/s;
server {
location /api/ {
# 每个IP限制10r/s,整个服务限制100r/s
limit_req zone=perip burst=20 nodelay;
limit_req zone=perserver burst=100;
}
}
}
可以记录被限流的请求:
http {
log_format limit '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'[$limit_conn_status] [$limit_req_status]';
access_log /var/log/nginx/limit.log limit;
}
$http_x_forwarded_for
处理代理后的真实IP以上配置可以根据实际需求组合使用,构建适合自己业务场景的限流策略。