温馨提示×

debian nginx怎样限流

小樊
41
2026-09-27 17:59:22
栏目: 智能运维

在 Debian 上使用 Nginx 限流,通常是通过 ngx_http_limit_req_module(请求频率限制) 和 ngx_http_limit_conn_module(连接数限制) 来实现的。下面按常见场景给你说明。


一、请求频率限流(limit_req)

1. 配置语法原理

  • limit_req_zone:定义限流规则和共享内存
  • limit_req:在 server 或 location 中应用

2. 示例:限制每个 IP 每秒最多 1 个请求

编辑 Nginx 配置(如 /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/limit.conf)

http {
    limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
}

在 server 或 location 中使用:

server {
    listen 80;
    server_name example.com;

    location / {
        limit_req zone=req_zone burst=5 nodelay;
        proxy_pass http://backend;
    }
}

参数说明

  • $binary_remote_addr:按客户端 IP 限流
  • 10m:共享内存大小
  • rate=1r/s:每秒 1 个请求
  • burst=5:允许突发 5 个请求
  • nodelay:突发请求立即处理(不排队)

二、连接数限流(limit_conn)

1. 限制单个 IP 并发连接数

http {
    limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
}
server {
    location / {
        limit_conn conn_zone 10;
    }
}

表示:每个 IP 最多 10 个并发连接


三、针对特定 URL 限流

location /api/ {
    limit_req zone=req_zone burst=10 nodelay;
}

只对 /api/ 接口限流,不影响静态资源。


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

geo $limit {
    default 1;
    127.0.0.1 0;
    192.168.1.0/24 0;
}

map $limit $limit_key {
    0 "";
    1 $binary_remote_addr;
}

limit_req_zone $limit_key zone=req_zone:10m rate=1r/s;

这样白名单 IP 不会被限流。


五、查看和重载配置

nginx -t
systemctl reload nginx

六、常见坑

  1. CDN / 负载均衡场景
    • 要用 $http_x_forwarded_for 代替 $binary_remote_addr
  2. 限流太严
    • 调大 burst
  3. 内存不足
    • zone 大小适当增大(如 20m)

如果你能说一下:

  • 是 API 限流 还是 网站防刷
  • 是否在 CDN / 反向代理后
  • Debian 版本 & Nginx 安装方式(apt / 编译)

我可以给你一套直接可用的配置。

0 踩