代碼如下:
??limit_req_zone?$server_name?zone=sname:10m?rate=1r/s;????????#限制服務器每秒只能有一次訪問成功 ????#limit_req_zone?$binary_remote_addr?zone=one:3m?rate=1r/s;????#限制ip,每秒只能訪問一次 ????#limit_req_zone?$binary_remote_addr?$uri?zone=two:3m?rate=1r/s;??#限制ip和路徑不帶參數(shù), ????#limit_req_zone?$binary_remote_addr?$request_uri?zone=thre:3m?rate=1r/s;??#限制ip和帶參數(shù)的路徑? ??server?{ ????listen????80; ????server_name?www.abc.com; ????location?/?{ ????????include?host/proxy.cnf; ????????proxy_pass?http://backend; ????} ????location?/api/createorder?{ ????????limit_req?zone=sname;??#不帶突發(fā),只能有一次正常請求 ????????limit_req_status?503;????#設置返回的狀態(tài)碼是503 ????????#limit_req?zone=sname?burst=5?nodelay;??#最大并發(fā)是5,并且實時處理 ????????include?host/proxy.cnf; ????????proxy_pass?http://backend; ????????error_page?503?=200?/50x.html;???#這里很重要,可以將錯誤的狀態(tài)碼503,返回結(jié)果的時候是200 ????} ????location?=?/50x.html?{ ????????if?($http_user_agent?~*?"mobile|android|iphone|iphone|ios|ios"){ ????????????#default_type?application/json; ????????????return?200?'{"msg":?"活動過于火爆,請稍后重試!","data":?{},"code":?-1}';??#設置移動端返回錯誤的信息顯示 ????????} ????????root??html;???#如果是pc端返回一個html頁面 ????} ????}
重點: 正常情況下,如果設置了限流,返回是503的狀態(tài)碼,這對于移動端來說即便是你返回json數(shù)據(jù)但是客戶端時不認的,這個時候巧妙的通過 error_page 403 =200 /50x.html;將狀態(tài)碼設置為200
以上只是使用了ngx_limit_req_module,同時也可以使用ngx_limit_conn_module模塊。
特別是一些咨詢類網(wǎng)站如果備爬蟲盯上,服務器可能會被爬蟲給干死(小網(wǎng)站就是這樣)
那么怎么辦呢,我們可以使用變量去做
#全局配置 limit_req_zone?$spider?zone=spider:60m?rate=200r/m;??#限制爬蟲每分鐘只能跑200次 #某個server中 limit_req?zone=spider?burst=5?nodelay; if?($http_user_agent?~*?“spider|bot”)?{ ??set?$spider?$http_user_agent;???#設置變量,進入這里的就進行限速 }
? 版權聲明
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載。
THE END