在 Linux 下使用 Nginx 限流,常用的是 基于 ngx_http_limit_req_module(请求频率限制) 和 ngx_http_limit_conn_module(连接数限制)。下面按常见场景说明。
nginx.conf(http 块)
http {
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
}
说明:
$binary_remote_addr:按客户端 IP 限流zone=req_limit:10m:共享内存 10MBrate=10r/s:每秒最多 10 个请求在 server 或 location 中使用
server {
location /api/ {
limit_req zone=req_limit burst=20 nodelay;
}
}
参数说明:
burst=20:允许突发 20 个请求nodelay:突发请求不延迟处理(否则排队)✅ 示例效果:
http 块
http {
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
}
server / location
location /download/ {
limit_conn conn_limit 5;
}
含义:
geo $limit {
default 1;
192.168.1.100 0;
}
map $limit $limit_key {
0 "";
1 $binary_remote_addr;
}
limit_req_zone $limit_key zone=req_limit:10m rate=10r/s;
这样:
192.168.1.100 不限流limit_req_status 429;
limit_conn_status 429;
nginx -t
nginx -s reload
日志中会出现:
limiting requests, excess: 5.000 by zone "req_limit"
❌ 限流不生效?
http 定义了 zonereload 了 Nginxreal_ip 模块)limit_req_zone $binary_remote_addr zone=api_limit:10m rate=5r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
location /api/ {
limit_req zone=api_limit burst=10 nodelay;
limit_conn conn_limit 10;
}
如果你有 具体场景(如:API、登录接口、爬虫防护、HTTPS、Docker),我可以给你更精准的配置。