Nginx可以通过多种方式限制访问频率,防止恶意请求和DDoS攻击。以下是几种常用的配置方法:
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server {
location / {
limit_req zone=one burst=20 nodelay;
# 其他配置...
}
}
}
参数说明:
- zone=one:10m
:创建名为"one"的共享内存区,大小为10MB
- rate=10r/s
:限制每秒10个请求
- burst=20
:允许突发20个请求
- nodelay
:不延迟处理突发请求,直接拒绝超过限制的请求
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location / {
limit_conn addr 5;
# 其他配置...
}
}
}
参数说明:
- zone=addr:10m
:创建名为"addr"的共享内存区,大小为10MB
- limit_conn addr 5
:每个IP地址最多允许5个并发连接
http {
geoip_country /usr/share/GeoIP/GeoIP.dat;
map $geoip_country_code $allowed_country {
default yes;
CN no; # 阻止中国IP
RU no; # 阻止俄罗斯IP
}
server {
if ($allowed_country = no) {
return 403;
}
# 其他配置...
}
}
http {
limit_req_zone $binary_remote_addr zone=login:10m rate=2r/s;
server {
location /login {
limit_req zone=login burst=5;
# 其他配置...
}
}
}
http {
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
access_log /var/log/nginx/access.log main;
}
server {
location /downloads/ {
limit_rate 50k; # 限制下载速度为50KB/s
# 其他配置...
}
}
geo $limit {
default 1;
10.0.0.0/8 0; # 内部网络
192.168.0.0/16 0; # 内部网络
1.2.3.4 0; # 特定IP
}
map $limit $limit_key {
0 "";
1 $binary_remote_addr;
}
limit_req_zone $limit_key zone=req_zone:10m rate=5r/s;
server {
location / {
limit_req zone=req_zone burst=10 nodelay;
# 其他配置...
}
}
通过以上配置,可以有效地保护您的网站免受恶意请求和DDoS攻击的影响。