Nginx简单防止cc攻击

被同事恶搞了一次,因为穷,没有机器,没有cdn,没有lvs,所以只能单台nginx防止同一个Ip的攻击了。

在nginx.conf http模块增加

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

说明:区域名称为one(自定义),占用空间大小为10m,平均处理的请求频率不能超过每秒一次。
$binaryremoteaddr是$remoteaddr(客户端IP)的二进制格式,固定占用4个字节(可能是C语言的long类型长度)。而$remoteaddr按照字符串存储,占用7-15个字节。这样看来用$binaryremoteaddr可以节省空间,但网上又说64位系统下都是占用64个字节,没搞清楚,总之尽量用$binaryremoteaddr吧。

在server里找到localtion / 增加代码

limit_req zone=one burst=5  nodelay;  
if ($http_user_agent ~* "spider|Googlebot") {  
       $anti_spider $http_user_agent;
}

其中zone=one和前面的http模块limitreqzone定义对应。
nodelay是不延迟,对用户发起的请求不做延迟处理,而是立即处理。比如上面定义的rate=1r/s,即每秒钟只处理1个请求。如果同一时刻有两个后缀为htm的请求过来了,若设置了nodelay,则会立刻处理这两个请求。若没设置nodelay,则会严格执行rate=1r/s的配置,即只处理一个请求,然后下一秒钟再处理另外一个请求。页面数据卡了,过了一秒后才加载出来。

if ($http_user_agent ~* "spider|Googlebot") {  
       $anti_spider $http_user_agent;
}

这段代码是针对用户发过的来的ua进行筛选,因为一般标准的爬虫都带一些特有的字段,所以在这针对爬虫进行一些过滤。

郝先生

继续阅读此作者的更多文章