生产环境必配!Nginx限流防攻击完整教程,复制就能上线,告别恶意请求
http { # 1. 定义固定窗口限流规则(http块中配置) limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s; # 说明: # $binary_remote_addr:按客户端IP限流(同一IP共享限流阈值) # zone=req_limit:10m:定义限流区域名req_limit,占用内存10M(可存储约16万个IP) # rate=10r/s:限流阈值,每秒最多10个请求(可修改,比如20r/s、5r/s) # 2. 在server块中引用限流规则(HTTPS server块,叠加到原有配置) server { listen 443 ssl http2; server_name www.xxx.com; # 引用固定窗口限流规则(核心) limit_req zone=req_limit burst=5 nodelay; # 说明: # burst=5:允许突发请求(超过阈值后,最多再接收5个请求,排队处理) # nodelay:突发请求不排队,直接处理(避免用户等待,提升体验) # 原有HTTPS、反向代理、静态资源配置(省略,和第6篇一致) }}http { # 1. 定义滑动窗口限流规则(http块中配置) limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s; server { listen 443 ssl http2; server_name www.xxx.com; # 引用滑动窗口限流规则(添加window=100ms) limit_req zone=req_limit burst=5 nodelay window=100ms; # 说明:window=100ms:将1秒窗口划分为10个100ms的时间片,实现滑动窗口限流 # 原有配置(省略) }}http { # 1. 固定窗口限流规则(原有) limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s; # 2. 定义连接数限流规则(http块中配置) limit_conn_zone $binary_remote_addr zone=conn_limit:10m; server { listen 443 ssl http2; server_name www.xxx.com; # 引用固定窗口限流 limit_req zone=req_limit burst=5 nodelay; # 引用连接数限流(核心) limit_conn conn_limit 5; # 限制同一IP同时最多5个连接 # 原有配置(省略) }}user nginx;worker_processes auto;error_log /var/log/nginx/error.log warn;pid /var/run/nginx.pid;events { worker_connections 10240; use epoll;}http { include mime.types; default_type application/octet-stream; server_tokens off; # 隐藏Nginx版本,安全加固 # 一、限流配置(核心) # 1. 固定窗口限流(按IP限流,每秒最多10个请求) limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s; # 2. 连接数限流(按IP限流,同时最多5个连接) limit_conn_zone $binary_remote_addr zone=conn_limit:10m; # 3. 限流后返回的错误页面(自定义,提升用户体验) limit_req_status 503; limit_conn_status 503; error_page 503 /503.html; location = /503.html { root /data/www; # 503页面存放目录,可自定义 internal; # 只允许内部访问,禁止直接访问 } # 二、防爬虫配置(拦截常见爬虫) # 1. 拦截爬虫User-Agent(常见爬虫标识,可补充) if ($http_user_agent ~* "Baiduspider|Googlebot|SogouSpider|Yahoo|bingbot|AhrefsBot") { return 403 "Forbidden: Crawler is not allowed"; # 拦截爬虫,返回403 } # 2. 拦截高频抓取敏感路径(比如/admin、/api) location ~* /(admin|api)/ { # 对敏感路径额外限流,每秒最多5个请求 limit_req zone=req_limit burst=3 nodelay; # 禁止爬虫访问敏感路径 if ($http_user_agent ~* "Baiduspider|Googlebot") { return 403; } } # 三、防恶意IP配置(拦截指定恶意IP,可添加多个) deny 192.168.1.100; # 直接拦截该IP deny 10.0.0.0/24; # 拦截整个IP段(10.0.0.1-10.0.0.255) allow all; # 允许其他所有IP访问 # 四、后端服务集群(延续第5篇负载均衡配置) upstream backend { server 127.0.0.1:8080 weight=5 max_fails=3 fail_timeout=10s; server 127.0.0.1:8081 weight=3 max_fails=3 fail_timeout=10s; server 192.168.1.101:8080 weight=2 max_fails=3 fail_timeout=10s; } # 五、HTTPS配置(延续第6篇,叠加限流等配置) server { listen 443 ssl http2; server_name www.xxx.com; # 你的域名 # SSL证书配置(修改为你的证书路径) ssl_certificate /etc/nginx/ssl/xxx.pem; ssl_certificate_key /etc/nginx/ssl/xxx.key; # HTTPS优化配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # 引用限流规则(核心) limit_req zone=req_limit burst=5 nodelay; limit_conn conn_limit 5; # 静态资源配置 location ~* \.(html|css|js|png|jpg)$ { root /data/www; expires 365d; } # 动态接口配置(负载均衡+反向代理) location /api { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 503错误页面配置 location = /503.html { root /data/www; internal; } } # 六、HTTP自动跳转HTTPS(延续第6篇) server { listen 80; server_name www.xxx.com; return 301 https://$host$request_uri; }}
# 检查配置(核心,必做)nginx -t# 平滑重启Nginx,让配置生效nginx -s reload# 模拟高频请求(测试限流)ab -n 100 -c 20 https://www.xxx.com/api/test# 模拟百度爬虫请求curl -H "User-Agent: Baiduspider" https://www.xxx.com
限流防攻击最常见6个报错curl https://www.xxx.com# 在http块中,新增核心接口限流规则limit_req_zone $binary_remote_addr zone=pay_limit:10m rate=5r/s;# 在server块中,给核心接口单独配置限流location /api/pay { proxy_pass http://backend; # 核心接口限流,每秒最多5个请求,比普通接口更严格 limit_req zone=pay_limit burst=2 nodelay; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr;}http { # 定义白名单IP(企业内部IP、测试IP) geo $white_ip { default 0; 192.168.1.0/24 1; # 内部IP段,不受限流限制 127.0.0.1 1; # 本地IP,不受限流限制 } # 限流规则修改:白名单IP不应用限流 limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s; server { # 引用限流规则,白名单IP跳过限流 limit_req zone=req_limit burst=5 nodelay if=$white_ip; # 说明:if=$white_ip:只有非白名单IP,才应用限流规则 }}
阅读原文:原文链接