Appearance
限流配置
限流可以防止恶意请求和DDoS攻击,保护服务器资源。
基本配置
定义限流区域
nginx
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;应用限流
nginx
location / {
limit_req zone=one burst=5 nodelay;
}完整配置
生产环境配置
nginx
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=login_limit:10m rate=1r/s;
server {
listen 80;
server_name api.example.com;
# API限流
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
proxy_pass http://backend;
}
# 登录限流
location /login/ {
limit_req zone=login_limit burst=5 nodelay;
proxy_pass http://backend;
}
}限流参数
limit_req_zone参数
$binary_remote_addr
- 客户端IP地址
- 使用二进制格式节省内存
zone
- 限流区域名称和大小
- 格式:名称:大小
rate
- 限流速率
- 格式:数字/单位(r/s、r/m)
limit_req参数
zone
- 使用的限流区域
burst
- 突发请求数量
- 允许短时间内的突发请求
nodelay
- 不延迟处理突发请求
- 立即处理或拒绝
不同场景的限流
API限流
nginx
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
proxy_pass http://backend;
}登录限流
nginx
limit_req_zone $binary_remote_addr zone=login_limit:10m rate=1r/s;
location /login/ {
limit_req zone=login_limit burst=5 nodelay;
proxy_pass http://backend;
}下载限流
nginx
limit_conn_zone $binary_remote_addr zone=addr:10m;
location /download/ {
limit_conn addr 1;
limit_rate 1m;
proxy_pass http://backend;
}基于URL的限流
nginx
limit_req_zone $request_uri zone=url_limit:10m rate=1r/s;
location / {
limit_req zone=url_limit burst=5 nodelay;
proxy_pass http://backend;
}自定义限流响应
自定义错误页面
nginx
limit_req_status 429;
error_page 429 /429.html;
location = /429.html {
root /usr/share/nginx/html;
}返回JSON
nginx
limit_req_status 429;
error_page 429 = @rate_limit;
location @rate_limit {
default_type application/json;
return 429 '{"error": "Rate limit exceeded"}';
}完整示例
生产环境配置
nginx
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=login_limit:10m rate=1r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
listen 80;
server_name api.example.com;
# API限流
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
proxy_pass http://backend;
}
# 登录限流
location /login/ {
limit_req zone=login_limit burst=5 nodelay;
proxy_pass http://backend;
}
# 下载限流
location /download/ {
limit_conn conn_limit 1;
limit_rate 1m;
proxy_pass http://backend;
}
# 自定义限流响应
limit_req_status 429;
error_page 429 = @rate_limit;
location @rate_limit {
default_type application/json;
return 429 '{"error": "Rate limit exceeded"}';
}
}监控限流
记录限流日志
nginx
log_format limit '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$request_time"';
access_log /var/log/nginx/limit.log limit;常见问题
限流过于严格
原因: rate设置过低
解决: 提高限流速率
nginx
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=20r/s;限流不生效
原因: limit_req未正确配置
解决: 检查limit_req配置
nginx
limit_req zone=api_limit burst=20 nodelay;总结
限流配置的关键点:
- limit_req_zone:定义限流区域
- limit_req:应用限流
- rate:设置限流速率
- burst:设置突发请求数
- nodelay:不延迟处理突发请求
- 自定义响应:自定义限流响应
合理配置限流,防止恶意请求和DDoS攻击。