Nginx提供了多种模块来限制客户端访问行为,可以有效防止滥用和DDoS攻击。以下是详细的配置方法:
使用ngx_http_limit_req_module
模块限制请求频率:
http {
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
server {
location / {
limit_req zone=req_limit burst=20 nodelay;
# 其他配置...
}
}
}
limit_req_zone
定义限制区域:
$binary_remote_addr
:基于客户端IPzone=req_limit:10m
:分配10MB内存存储状态rate=10r/s
:限制每秒10个请求limit_req
应用限制:
burst=20
:允许突发20个请求nodelay
:不延迟处理突发请求使用ngx_http_core_module
的limit_rate
指令:
location /download/ {
limit_rate 100k; # 限制为100KB/s
limit_rate_after 1m; # 前1MB不限速
}
limit_rate
:限制传输速率limit_rate_after
:达到指定大小后开始限速使用ngx_http_limit_conn_module
模块:
http {
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
location / {
limit_conn conn_limit 5; # 每个IP最多5个并发连接
# 其他配置...
}
}
}
limit_conn_zone
定义限制区域limit_conn
应用连接数限制http {
# 定义限流区域
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=5r/s;
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
server {
listen 80;
# 静态文件下载限速
location /static/ {
limit_rate 200k;
limit_rate_after 500k;
}
# API接口限流
location /api/ {
limit_req zone=req_zone burst=10 nodelay;
limit_conn conn_zone 3;
proxy_pass http://backend;
}
}
}
geo $limit {
default 1;
192.168.1.0/24 0; # 内网不限速
}
map $limit $limit_key {
0 "";
1 $binary_remote_addr;
}
limit_req_zone $limit_key zone=req_zone:10m rate=5r/s;
map $uri $limit_rate {
~*\.(mp4|flv)$ 500k;
default 1m;
}
server {
location / {
limit_rate $limit_rate;
}
}
limit_req_status 429;
limit_conn_status 429;
log_format rate_limit '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" - $server_name '
'Zone: $limit_req_status';
access_log /var/log/nginx/rate_limit.log rate_limit;
这些配置可以帮助您有效控制服务器的资源使用,防止滥用和恶意攻击。根据实际需求调整参数值以达到最佳效果。