上週玩客被百度蜘蛛給盯上了,百度蜘蛛對玩客的抓取頻率增長了5倍。百度蜘蛛抓取量驟增,致使服務器負載很高。最終用nginx的ngx_http_limit_req_module模塊限制了百度蜘蛛的抓取頻率。每分鐘容許百度蜘蛛抓取200次,多餘的抓取請求返回503。html
nginx的配置:node
#全局配置nginx
limit_req_zone $anti_spider zone=anti_spider:60m rate=200r/m;算法
#某個server中服務器
limit_req zone=anti_spider burst=5 nodelay;併發
if ($http_user_agent ~* 「baiduspider」) {ide
set $anti_spider $http_user_agent;spa
}orm
參數說明:server
指令linit_req_zone 中的rate=200r/m 表示每分鐘只能處理200個請求。
指令limit_req 中的burst=5 表示最大併發爲5。即同一時間只能同時處理5個請求。
指令limit_req 中的 nodelay 表示當已經達到burst值時,再來新請求時,直接返回503
IF部分用於判斷是不是百度蜘蛛的user agent。若是是,就對變量$anti_spider賦值。這樣就作到了只對百度蜘蛛進行限制了。
詳細的參數說明,能夠查看官方文檔。
http://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req_zone
這個模塊對請求的限制採用了漏桶算法。
漏桶算法詳見 http://baike.baidu.com/view/2054741.htm
相關代碼請查看nginx源碼文件 src/http/modules/ngx_http_limit_req_module.c
代碼的核心部分是ngx_http_limit_req_lookup 方法。