Nginx提供了多种方式来限制客户端请求速率,防止服务器被过多请求压垮。以下是几种常用的配置方法:
limit_req_zone
和limit_req
指令可以限制单个IP的请求速率。
http {
# 定义限制区域,名为one,10MB大小,限制每秒5个请求
limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
server {
location / {
# 应用限制区域one
limit_req zone=one;
# 其他配置...
}
}
}
location /api/ {
# 应用限制区域one,允许突发10个请求,无延迟处理
limit_req zone=one burst=10 nodelay;
# 其他配置...
}
burst
:允许的突发请求数nodelay
:不延迟处理突发请求,立即处理但限制后续请求限制单个IP的同时连接数:
http {
# 定义连接限制区域,名为addr,10MB大小
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location /download/ {
# 每个IP最多5个连接
limit_conn addr 5;
# 其他配置...
}
}
}
http {
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=api_conn:10m;
server {
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
limit_conn api_conn 10;
# 其他配置...
}
}
}
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;
geo $limited {
default 1;
192.168.1.0/24 0;
10.1.0.0/16 0;
}
map $limited $limit {
1 $binary_remote_addr;
0 "";
}
limit_req_zone $limit zone=req_zone:10m rate=5r/s;
http {
limit_req_status 429; # 默认是503
limit_conn_status 429;
server {
error_page 429 /rate_limit.html;
location = /rate_limit.html {
root /usr/share/nginx/html;
internal;
}
}
}
配置完成后,可以使用以下工具测试限制是否生效:
- ab
(Apache Benchmark)
- wrk
- siege
- jmeter
例如:
ab -n 100 -c 10 http://yourserver.com/api/
通过以上配置,您可以有效地保护Nginx服务器免受过多请求的影响,确保服务的稳定性。