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