Nginx提供了多种限流机制来控制客户端请求速率,防止服务器过载。以下是几种常用的限流方法:
http {
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
location / {
limit_conn perip 10; # 每个IP最多10个并发连接
limit_conn perserver 100; # 整个服务器最多100个并发连接
}
}
}
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
server {
location / {
limit_req zone=one burst=5 nodelay;
# rate=1r/s 表示每秒1个请求
# burst=5 表示允许突发5个请求
# nodelay 表示不延迟处理突发请求
}
}
}
location /download/ {
limit_rate 50k; # 限制下载速度为50KB/s
limit_rate_after 500k; # 前500KB不限速
}
http {
# 定义限流区域
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
listen 80;
server_name api.example.com;
location /api/ {
# 请求速率限制
limit_req zone=api_limit burst=20 nodelay;
# 并发连接限制
limit_conn conn_limit 5;
# 响应速率限制
limit_rate 100k;
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_limit:10m rate=5r/s;
map $uri $limit_bucket {
~^/api/v1/login "login";
~^/api/v1/search "search";
default "default";
}
limit_req_zone $binary_remote_addr zone=login_limit:10m rate=2r/s;
limit_req_zone $binary_remote_addr zone=search_limit:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=default_limit:10m rate=100r/s;
server {
location /api/v1/ {
limit_req zone=$limit_bucket burst=5;
}
}
nginx
limit_req_status 429;
limit_conn_status 503;
error_log /var/log/nginx/limit_errors.log;
nginx
add_header X-RateLimit-Limit $limit_req;
add_header X-RateLimit-Remaining $limit_req_remaining;
以上配置可以根据实际业务需求进行调整,建议在测试环境验证后再应用到生产环境。