温馨提示×

linux nginx怎么限流

小樊
46
2026-10-07 21:27:19
栏目: 智能运维

在 Linux 下使用 Nginx 限流,常用的是 基于 ngx_http_limit_req_module(请求频率限制) 和 ngx_http_limit_conn_module(连接数限制)。下面按常见场景说明。


一、请求频率限流(最常用)

1️⃣ 限制单个 IP 的请求速率

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:共享内存 10MB
  • rate=10r/s:每秒最多 10 个请求

在 server 或 location 中使用

server {
    location /api/ {
        limit_req zone=req_limit burst=20 nodelay;
    }
}

参数说明:

  • burst=20:允许突发 20 个请求
  • nodelay:突发请求不延迟处理(否则排队)

✅ 示例效果:

  • 正常:10 请求/秒
  • 突发:最多 30 请求/秒(10 + 20)

二、连接数限流(防止过多连接)

2️⃣ 限制单 IP 并发连接数

http 块

http {
    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
}

server / location

location /download/ {
    limit_conn conn_limit 5;
}

含义:

  • 每个 IP 最多 5 个并发连接

三、白名单(不限制某些 IP)

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 不限流
  • 其他 IP 限流

四、返回自定义错误码

limit_req_status 429;
limit_conn_status 429;

五、查看是否生效

nginx -t
nginx -s reload

日志中会出现:

limiting requests, excess: 5.000 by zone "req_limit"

六、常见坑

❌ 限流不生效?

  • 是否在 http 定义了 zone
  • 是否 reload 了 Nginx
  • 是否用了 CDN(要看真实 IP:real_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),我可以给你更精准的配置。

0 踩