DDoS(分布式拒绝服务)攻击通过大量恶意流量淹没服务器资源,导致合法用户无法访问服务。作为高性能Web服务器和反向代理,Nginx可以通过多种配置有效缓解DDoS攻击。
http {
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
limit_conn conn_limit_per_ip 20; # 每个IP最多20个连接
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;
limit_req zone=req_limit_per_ip burst=20 nodelay;
}
server {
client_body_timeout 10s;
client_header_timeout 10s;
keepalive_timeout 15s;
send_timeout 10s;
client_max_body_size 1m; # 限制请求体大小
client_body_buffer_size 16k;
}
geo $blocked_country {
default 0;
include /etc/nginx/conf.d/blocked_countries.conf;
}
server {
if ($blocked_country) {
return 444; # 静默关闭连接
}
}
map $remote_addr $deny_ip {
default 0;
include /etc/nginx/conf.d/blacklist.conf;
}
server {
if ($deny_ip) {
return 403;
}
}
http {
limit_req_zone $binary_remote_addr zone=login_limit:10m rate=2r/s;
server {
location /login {
limit_req zone=login_limit burst=5 nodelay;
# 其他配置
}
}
}
worker_rlimit_nofile 65535; # 每个worker进程的文件描述符限制
events {
worker_connections 4096;
}
net.ipv4.tcp_syncookies = 1 # 在/etc/sysctl.conf中设置
http {
log_format ddos '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'Request_Time=$request_time';
access_log /var/log/nginx/ddos.log ddos;
}
#!/bin/bash
# 监控异常请求
tail -f /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -nr
当遭受攻击时: 1. 启用紧急限流规则 2. 临时屏蔽攻击源IP段 3. 切换到维护模式(503响应) 4. 联系ISP进行流量清洗
# 紧急限流规则示例
limit_req_zone $binary_remote_addr zone=emergency:10m rate=5r/m;
通过以上配置和策略,Nginx可以有效缓解大多数DDoS攻击,保护Web服务的可用性。