以下是一个关于Nginx限流功能的详细配置示例,涵盖连接数限制、请求速率限制及组合防护方案:
一、基础限流配置
1. 连接数限制(ngx_http_limit_conn_module)
http {
# 定义共享内存区(10MB空间,存储连接状态)
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
listen 80;
server_name example.com;
# 全局限流(单个IP最大并发连接数)
limit_conn conn_limit 50; # 限制每个IP最多50个并发连接
location / {
proxy_pass http://backend;
}
# 特殊路径单独限流
location /api/sensitive {
limit_conn conn_limit 10; # 敏感接口更严格限制
}
}
}
2. 请求速率限制(ngx_http_limit_req_module)
http {
# 定义速率限制区(10MB空间,存储请求状态)
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s; # 全局限速10请求/秒
server {
listen 80;
server_name api.example.com;
location /api/ {
# 基础速率限制
limit_req zone=api_limit burst=20 nodelay; # 突发20请求,不延迟处理
# 组合连接数限制
limit_conn conn_limit 20;
proxy_pass http://backend_api;
}
}
}
二、高级限流场景
1. 分层限流策略
http {
# 定义多层限流区
limit_req_zone $binary_remote_addr zone=global_limit:10m rate=100r/s; # 全局限速
limit_req_zone $server_name zone=server_limit:10m rate=50r/s; # 服务器级限速
server {
listen 80;
server_name pay.example.com;
location /payment/ {
# 多层限流叠加
limit_req zone=global_limit burst=50;
limit_req zone=server_limit burst=30;
# 最终生效规则:min(100r/s, 50r/s) = 50r/s,突发队列总长度80
proxy_pass http://payment_backend;
}
}
}
2. 动态限流(需Nginx Plus)
http {
# 基于服务状态的动态限流
limit_req_status 503; # 自定义限流响应码
limit_req_zone $binary_remote_addr zone=dynamic_limit:10m rate=5r/s;
server {
listen 80;
server_name dynamic.example.com;
location / {
# 结合服务健康度动态调整限流阈值
limit_req zone=dynamic_limit
burst=10
nodelay
window=2s; # 滑动窗口时间范围
proxy_pass http://backend_service;
health_check; # 需配合Nginx Plus健康检查
}
}
}
3. 地理围栏限流
http {
# 定义地理限流区(需GeoIP模块)
map $geoip_country_code $allowed_country {
default no;
CN yes;
US yes;
}
limit_req_zone $binary_remote_addr zone=geo_limit:10m rate=5r/s;
server {
listen 80;
server_name global.example.com;
location / {
if ($allowed_country = no) {
limit_req zone=geo_limit burst=2 nodelay; # 非允许国家更严格限流
}
proxy_pass http://global_backend;
}
}
}
三、监控与调试配置
1. 实时状态监控
http {
server {
listen 8080;
server_name status.example.com;
location /limit_status {
# 自定义限流状态页(需Lua模块)
content_by_lua_block {
local zone = ngx.shared.api_limit
ngx.say("Active requests: ", zone.active)
ngx.say("Rejected requests: ", zone.rejected)
}
allow 192.168.1.0/24;
deny all;
}
}
}
2. 详细日志记录
http {
log_format限流日志 '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$limit_rate $limit_conn ' # 记录限流状态
'$upstream_response_time';
access_log /var/log/nginx/limit_access.log限流日志;
}
四、性能调优建议
-
内存优化
- 共享内存区大小计算公式:
预估并发用户数 × (记录大小 + 指针大小)
- 典型记录大小:IPv4约32字节,IPv6约128字节
- 共享内存区大小计算公式:
-
突发处理
burst
参数应设置为平均速率 × 突发时间窗口
(例如:100r/s × 5s = 500)- 结合
nodelay
参数实现立即处理突发请求
-
滑动窗口优化
- 使用
window
参数替代默认漏桶算法(需Nginx 1.19+) - 示例:
limit_req zone=name rate=10r/s window=2s;
实现2秒内10请求的平滑限制
- 使用
五、安全加固方案
1. 组合防护配置
http {
# 定义多层防护区
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=20r/s;
server {
listen 443 ssl;
server_name secure.example.com;
location /api/v1/ {
# 连接数限制
limit_conn conn_zone 30;
# 请求速率限制
limit_req zone=req_zone burst=50 nodelay;
# 组合防护逻辑
if ($slow_attack_signature) {
limit_conn conn_zone 5; # 触发攻击特征时加强限制
limit_req zone=req_zone rate=5r/s burst=10;
}
proxy_pass http://secure_backend;
}
}
}
2. 自动封禁配置(需Fail2ban)
# /etc/fail2ban/filter.d/nginx-limit.conf
[Definition]
failregex = limiting requests, excess:.*client: <HOST>
# /etc/fail2ban/jail.local
[nginx-limit]
enabled = true
filter = nginx-limit
action = iptables-multiport[name=HTTP, port="http,https"]
logpath = /var/log/nginx/*error.log
maxretry = 10
findtime = 600
bantime = 3600
六、配置验证与测试
-
语法检查
nginx -t -c /etc/nginx/nginx.conf
-
压力测试
# 使用wrk进行限流测试 wrk -t4 -c100 -d30s --latency http://api.example.com/api/
-
实时监控
# 观察限流计数器 watch -n1 "nginx -s limit_status" # 分析访问日志 awk '/limit_conn/ || /limit_req/' /var/log/nginx/access.log
七、最佳实践建议
-
分级限流策略
- 基础层:全局限速(防止DDoS)
- 业务层:接口级限速(保护核心服务)
- 用户层:单个用户限速(防止刷接口)
-
动态调整机制
- 结合Prometheus监控指标,通过API动态修改限流阈值
- 示例:使用
ngx_http_lua_module
实现动态配置加载
-
容灾设计
- 配置
limit_req_status 503
返回自定义错误页 - 结合
proxy_next_upstream
实现服务降级
- 配置
通过合理配置限流策略,可有效防御DDoS攻击、保护后端服务、维护系统稳定性。实际部署时建议通过全链路压测确定阈值,并结合业务增长情况定期调整限流参数。