Update:這個方法問題好像還是不少,目前先拿掉了...
這幾天 blog 被掃中單一頁面負載會比較重的頁面,結果 CPU loading 變超高,從後台可以看到常常滿載:

看了一下是都是從 Azure 上面打過來的,有好幾組都在打,IP address 每隔一段時間就會變,所以單純用 firewall 擋 IP address 的方法看起來沒用...
印象中 nginx 本身可以 rate limit,搜了一下文件可以翻到應該就是「Module ngx_http_limit_req_module」這個,就設起來暫時用這個方式擋著,大概是這樣:
limit_conn_status 429; limit_req_status 429; limit_req_zone $binary_remote_addr zone=myzone:10m rate=10r/m;
其中預設是傳回 5xx 系列的 service unavailable,但這邊用 429 應該更正確,從維基百科的「List of HTTP status codes」這邊可以看到不錯的說明:
429 Too Many Requests (RFC 6585)
The user has sent too many requests in a given amount of time. Intended for use with rate-limiting schemes.
然後 virtual host 的設定檔內把某個 path 放進這個 zone 保護起來,目前比較困擾的是需要 copy & paste try_files
與 FastCGI 相關的設定:
location /path/subpath { limit_req zone=myzone; try_files $uri $uri/ /index.php?$args; include fastcgi.conf; fastcgi_intercept_errors on; fastcgi_pass php74; }
這樣一來就可以自動擋下這些狂抽猛送的 bot,至少在現階段應該還是有用的...
如果之後有遇到其他手法的話,再見招拆招看看要怎麼再加強 :o
送429是君子之間
對付惡意bot直接5系列讓它script直接死去就好啦
這大概是預設值的背後心理吧?