Nginx防火墙模块配置:限制访问与防爬虫实操
有个客户的站点被竞品爬虫疯狂抓数据,一天几十万请求,服务器CPU直接拉满。他第一反应是买WAF,其实Nginx自带的几个模块就能解决大部分问题,不用多花一分钱。
limit_req:限流防刷的第一道门
Nginx的limit_req模块基于漏桶算法,能精准控制单个IP的请求频率。配置分两步:
先在http块定义限流区域:
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=20r/s;
然后在server或location块里引用:
limit_req zone=mylimit burst=40 nodelay;
这表示每个IP每秒最多20个请求,允许突发40个请求立即处理,超出的直接返回503。burst值根据业务调整,API接口可以设低一些,静态页面可以高一些。
User-Agent过滤:挡掉低级爬虫
很多爬虫的User-Agent特征明显,直接在Nginx层拦截效率最高。常见做法:
if ($http_user_agent ~* (Scrapy|curl|python|wget|spider|bot)) {
return 403;
}
注意别把Googlebot和百度spider也挡了,除非你确实不想被收录。可以加白名单:先判断是不是合法爬虫UA,合法的放行,其余的拦。
更狠的做法是判断User-Agent是否为空。正常浏览器请求都带UA,空UA的基本都是脚本请求,直接返回444(Nginx特有状态码,不返回任何响应直接断开连接)。
IP黑白名单与目录保护
管理后台是重点保护对象。用allow/deny指令限制只有特定IP能访问:
location /admin/ {
allow 192.168.1.100;
deny all;
}
如果IP不固定,可以用Nginx的auth_basic加一层密码验证。管理后台加双重防护总没坏处。
上传目录也要处理。/uploads/目录下禁止执行PHP:
location ~* /uploads/.*\.(php|phtml)$ {
deny all;
}
这条规则能防住通过上传PHP木马GetShell的攻击路径,简单但有效。
Nginx防火墙配置虽然不如专业WAF全面,但胜在零成本、高性能。配合系统层iptables和云端WAF,基本能覆盖常见攻击场景。关键是别裸奔,先配上基础规则再说。