(1)确认目标:明确要保护的是台湾地区托管的站群(多个站点共享云主机或同一IP段),目标是保证抓取不致耗尽带宽或触发安全告警。 (2)环境收集:列出主机、公网IP、带宽峰值、OS 版本、Web 服务(如 Nginx/Apache)、是否有 CDN、是否有 WAF。 (3)备份与测试计划:在改配置前备份 nginx/conf、iptables、systemd 服务并制定回滚步骤。
(1)开启实时流量观测:安装iftop、nload或使用vnstat记录流量:apt install iftop vnstat。 (2)抓取日志分析:从Nginx access.log筛选User-Agent和IP,命令示例:awk '{print $1,$12}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head。 (3)计算峰值并发:使用GoAccess或自建脚本统计每秒请求数(RPS),为后续限流参数设定基线。
(1)设置robots.txt:对非重要路径禁止抓取,示例:User-agent: * Disallow: /admin/ Disallow: /private/ Allow: /. (2)为不同站点制定抓取优先级:为重要站点保留Allow,为低价值站点设置Crawl-delay(注意多数搜索引擎忽略Crawl-delay,但仍可用于遵守性良好的爬虫)。 (3)提交sitemap:确保站点 sitemap.xml 指向优先抓取页面,减少无效抓取。
(1)启用limit_conn和limit_req:在http或server块加入示例:limit_conn_zone $binary_remote_addr zone=addr:10m; limit_req_zone $binary_remote_addr zone=req:10m rate=5r/s; 在location中:limit_conn addr 10; limit_req zone=req burst=20 nodelay; (2)测试并调整:先设保守值(如5r/s),观察错误率和延迟,再逐步放宽。 (3)返回503策略:当触发限流返回429或503,使用自定义页面提示搜索引擎稍后重试。
(1)按IP限速(iptables示例):iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j DROP。 (2)使用hashlimit限速:iptables -A INPUT -p tcp --dport 80 -m hashlimit --hashlimit 10/s --hashlimit-mode srcip --hashlimit-name http_limit -j ACCEPT。 (3)持久化并测试:将规则写入脚本并在负载低峰时生效,记录被限IP以便分析误杀。
(1)安装与查看:tc qdisc show; (2)简单限速示例:tc qdisc add dev eth0 root handle 1: htb default 30; tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit; tc class add dev eth0 parent 1:1 classid 1:30 htb rate 80mbit ceil 100mbit; (3)按IP/端口分流:结合tc filter和fwmark(先用iptables给特定IP打标,再用tc filter匹配并限速)。
(1)启用台湾节点CDN:选择拥有台湾 POP 的CDN供应商,将静态资源与可缓存HTML放到CDN。 (2)缓存控制头:配置Cache-Control:max-age、s-maxage等,示例:add_header Cache-Control "public, max-age=86400"; (3)缓存清理策略:使用主动清除API或带版本号的资源路径,避免频繁回源。
(1)部署WAF:启用云WAF或ModSecurity规则集,拦截已知恶意UA和异常行为。 (2)Bot验证:对可疑IP或UA触发JS挑战或验证码(recaptcha、hCaptcha)来分辨真实用户与爬虫。 (3)白名单搜索引擎:对Googlebot等可信爬虫可放宽限流,注意校验User-Agent与反向DNS。
(1)集中日志:使用Filebeat/Fluentd推送access.log到ELK/EFK,便于实时分析爬虫行为。 (2)指标监控:Prometheus抓取Nginx VTS或Exporter数据,Grafana绘制RPS、响应码、带宽曲线并设置阈值告警。 (3)自动化响应:结合报警触发自动脚本(例如临时提高限流,封禁IP段,触发CDN降级策略)。
(1)自动封禁策略:用fail2ban或自写脚本根据短期异常请求率封禁IP(举例:10秒内请求>100则封禁10分钟)。 (2)分级策略:区分低风险(放行)、中风险(限速)、高风险(直接封禁)。 (3)保留白名单:为重要抓取器(站长工具、搜索引擎)保留白名单,避免误判。
(1)流量配额:对站群内每个站点分配带宽/并发上限(使用Nginx的map和limit_req结合虚拟主机实现)。 (2)资源隔离:尽量将高流量站点移至独立实例或使用容器,避免单点被一站击垮。 (3)负载均衡:用LVS/HAProxy实现后端分流,按站点权重分配流量。
(1)误伤用户:若发现正常用户被限流,快速回滚限流配置并记录触发条件。 (2)流量突增:自动扩容实例或临时开启更宽带宽(云厂商API),并同时提升限流策略。 (3)日常演练:定期做抓取压力测试(ab、wrk)验证当前阈值。
(1)先评估再配置:以监控数据为准设定阈值。 (2)分层防护:robots→Nginx限流→iptables/tc→CDN/WAF→监控自动化。 (3)留有回滚通道与白名单,定期复盘抓取策略。
问:如何区分合法的搜索引擎抓取和恶意爬虫?
答:首先校验User-Agent并做反向DNS(例如Googlebot应解析到googlebot.com),其次观察行为:合法抓取遵循robots、请求速率稳定且从有限IP段来;异常爬虫通常并发高、访问随机页面、跳转深且IP分散。结合日志与反DNS可以基本判定。
问:当发现带宽被抓取瞬间耗尽,有哪些紧急措施?
答:立即启用临时限流(Nginx限流或iptables快速规则)、在CDN开启“下游缓存优先/降级”模式、封禁高频IP段、临时提升云带宽或启用流量清洗,再在低峰时分析并调整长期策略。
问:针对台湾地区部署的站群,有哪些特别注意事项?
答:选用有台湾节点的CDN与云服务以降低延迟,注意遵循当地法规与隐私要求;因台湾地理位置靠近大陆与日本,关注跨境抓取源IP段并在WAF/黑名单中预置已知恶意段,同时优先配置多点备援以抵御突发抓取流量。