1. 主要限流模块
Nginx有两个核心限流模块:
ngx_http_limit_req_module
– 限制请求速率ngx_http_limit_conn_module
– 限制连接数
2. 限制请求速率(limit_req)
基本配置
http {
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=10r/s;
server {
location / {
limit_req zone=req_zone burst=20 nodelay;
# 其他配置...
}
}
}
参数说明
$binary_remote_addr
:以客户端IP作为限流依据zone=req_zone:10m
:创建10MB大小的共享内存区存储状态rate=10r/s
:允许每秒10个请求burst=20
:允许突发20个请求nodelay
:不延迟处理突发请求(立即处理但可能返回503)
3. 限制连接数(limit_conn)
http {
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
server {
location / {
limit_conn conn_zone 5; # 每个IP最多5个连接
# 其他配置...
}
}
}
4. 多级限流策略
http {
# 全局限制(每个IP每秒10请求)
limit_req_zone $binary_remote_addr zone=global:10m rate=10r/s;
# 特定URL限制(登录接口更严格)
limit_req_zone $binary_remote_addr zone=login:10m rate=2r/s;
server {
# 全局应用
limit_req zone=global burst=20 nodelay;
location /login {
# 登录接口更严格限制
limit_req zone=login burst=5;
}
location /api/ {
# API接口单独限制
limit_req zone=global burst=50;
}
}
}
5. 实际应用建议
- 分层限流:全局+特定URL组合限流
- 合理设置burst值:允许合理突发但不影响服务
- 监控调整:根据日志不断优化限流阈值
- 结合日志分析:
$request_time
和$upstream_response_time
识别异常
6. 性能考虑
- 共享内存区大小(zone)应根据预期IP数量设置
- 在高并发环境中,limit_conn可能比limit_req更消耗资源
- 对于大型部署,考虑在前置负载均衡器上做限流
正确配置Nginx限流可以显著提高网站抗DDoS能力,同时保证正常用户的访问体验。