Nginx 限流与恶意请求防护

1. 先理解目标

新手可以先把这一类配置理解成一句话:

  • 不是所有请求都应该无限制地放过去

Nginx 在安全防护里常做三类事:

  • 限制访问频率
  • 限制并发连接
  • 拦截明显异常或恶意请求

高手更关心的是:

  • 限流粒度按 IP、接口还是用户维度
  • 爆发流量是否允许短暂突增
  • 防护规则是否会误伤正常请求

2. 最基础的请求限流

http {
    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
 
    server {
        location /api/ {
            limit_req zone=api_limit burst=20 nodelay;
            proxy_pass http://127.0.0.1:3000;
        }
    }
}

先看懂这两个配置:

  • limit_req_zone:定义限流规则
  • limit_req:在具体位置启用规则

如何理解:

  • 平均每秒 10 个请求
  • 允许短时间突发 20 个请求
  • nodelay 表示超过平均速率时直接按照突发额度处理,而不是排队等待

3. 连接数限制

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

适用场景:

  • 单 IP 并发连接过多
  • 下载、爬虫、刷接口等异常行为明显

4. 常见恶意请求防护思路

4.1 拦截隐藏文件访问

location ~ /\. {
    deny all;
}

4.2 限制请求体大小

client_max_body_size 20m;

4.3 限制敏感路径

location /admin/ {
    allow 10.0.0.0/8;
    deny all;
}

5. 怎么避免误伤

这是高手最容易关心、也是新手最容易忽视的部分。

建议:

  • 先在高风险接口上启用,不要全站一刀切
  • 先记录日志,再逐步收紧限流阈值
  • 区分静态资源、登录接口、管理接口三类流量
  • 对高并发正常业务,先压测后上生产

6. 排查清单

  • 已明确按 IP、路径还是更细粒度限流
  • 已区分正常业务突发和恶意流量
  • 限流命中时有可观察日志
  • 管理接口与公共接口防护策略不同
  • 生产环境已验证不会误伤核心业务流量

7. 相关笔记