小白站长cdn被刷量!服务器被四层ddos!cdn配合nginx精细化限速解决!
配置说明
...
http {
# 日志记录tcp三次握手的$remote_addr
# 记录x-real-ip
# 记录x-forward-ip 用户的真实ip一定在其中
log_format access '$remote_addr $server_port - $http_host [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$http_x_forwarded_for|$http_x_real_ip|$limit_key';
access_log /dev/stdout access;
#添加白名单
geo $limit {
default 1;
192.168.0.0/24 0;
10.0.0.0/8 0;
127.0.0.0/8 0;
43.132.198.237/32 0;
}
# 先匹配x-forwarded-for中的ip,没匹配到则用remote_addr作为用户ip
map $http_x_forwarded_for $real_ip {
default $remote_addr;
"~^(?P<ip>[^,]+)" $ip;
}
# 白名单不限速
map $limit $limit_key {
0 "";
1 $real_ip;
}
# 限制每个ip请求频率
limit_req_zone $limit_key zone=req_ip:10m rate=5r/s;
# 限制整个服务的请求频率
limit_req_zone $server_name zone=req_svr:1m rate=50r/s;
# 超限断开连接
limit_req_status 444;
# 限制单ip并发连接
limit_conn_zone $limit_key zone=con_ip:10m;
server {
# 配置解析dns
resolver kube-dns.kube-system.svc.cluster.local ipv6=off;
# 配置ssl
listen 443 ssl;
ssl_certificate /app/cert.pem;
ssl_certificate_key /app/cert.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
# 配置证书过期验证在服务器上验证
ssl_stapling on;
ssl_stapling_verify on;
# 开启gzip压缩,节省流量
gzip on;
gzip_types *;
gzip_comp_level 6;
gzip_min_length 256;
gzip_buffers 16 8k;
gzip_proxied any;
gzip_vary on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
# 配置服务匹配的域名
server_name www.dk8s.com;
server_name www.dk8s.cn;
# 限制每个链接的下载速率
limit_rate 100k;
limit_rate_after 1m;
# 限制单ip的并发连接数
limit_conn con_ip 40;
location / {
# 限制单ip的突发为100,排队长度为200
limit_req zone=req_ip burst=100 delay=200;
# 限制服务的突发为1000,排队长度为2000
limit_req zone=req_svr burst=1000 delay=2000;
# 传递host
proxy_set_header Host $host;
# 请求ip作为x-real-ip
proxy_set_header X-Real-IP $remote_addr;
# 追加nginx的ip到x-forward-for中
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 传递请求协议
proxy_set_header X-Forwarded-Proto $scheme;
# 传递到后端服务
proxy_pass http://dk8s-web-svc.default.svc.cluster.local:80;
}
location /public/pkg/ {
# 限制客户端下载并发为2
limit_conn con_ip 2;
limit_req zone=req_ip burst=10;
limit_req zone=req_svr burst=100;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://dk8s-res-svc.default.svc.cluster.local:5000/pkg/;
}
...
}
...
}
}

