在昨天學習如何有效地限制特定IP來訪,以避免大量的惡意攻擊後,
今天我們要來學習另外的反爬蟲的相關技術,
也就是昨天有說到的「頻繁請求限制」,那接下來就是今天的學習。
我們在詳細開始學習前,應該要先了解什麼是「頻繁請求限制」,
簡單來說,就是當你在使用爬蟲在短時間內發送過多請求時,
網站會為了保護伺服器的穩定運行,進而對某一IP或帳號的請求數進行限制。
而當超過一定的次數或頻率時,伺服器會拒絕響應,甚至封鎖該IP。
這邊就要進行到實作的部份了,而我們這邊使用的一樣是Nginx來作範例,
接下來就開始吧。
首先我們要先找到設置Nginx的配置文件:
在上述的範例中,我想特別講的是*/etc/nginx/nginx.conf*這行程式碼,
它是這邊最重要的一部分,意思是指Nginx 伺服器的核心配置文件的路徑。
而通過修改這個文件,就可以配置 Nginx 的行為,其中就包括設置反爬蟲限制、
定義虛擬主機、設置網站根目錄等。
再接著,我們就要來學習限制流量了,以下範例:
在上述的範例中,我想把它拆分做上下部份來分別做解釋:
limit_req_zone:
這行的功用主要是用來定義一個速率的限制區域,用來追蹤和控制請求速率。
而限速區域的參數會被應用到後續的請求限制規則中
$binary_remote_addr:
用來表示用戶的 IP 地址。Nginx 會根據每個 IP 來跟蹤每個 IP 的請求次數。
(binary表示是二進制的格式,以此可以節省內存)
zone=mylimit:10m:
這裡的 mylimit 是這個區域的名稱,你也可以任意命名其它的名字。
而10m 則是表示這個區域分配了 10MB 的共享記憶體來儲存 IP 地址
以及其相關請求數據。
rate=10r/s:
這裡則定義了每個 IP 地址每秒最多允許發送的請求數量。
在此範例中是 10 個請求/秒 (r/s 表示 requests per second)
講完上半部份後,這邊進到下面的部份:
limit_req:
這條指令實際應用到上面定義的 mylimit 區域,並將這個速率限制規則
應用到後續的請求。
burst=20:
burst 設置了允許超過速率限制的突發請求數量。
這就表示短時間內可以允許最多 20 個額外請求(加上 rate 定義的速率)。
舉個例子,如果速率是 10r/s,那麼即使一個用戶一秒內發送 30 個請求,
只要突發數量在 20 個內,Nginx 會允許這些請求進入而不立即拒絕。
nodelay:
nodelay 表示即使突發請求超過常規速率,也不會延遲處理,而是立即進行。
如果沒有這個參數,超過 rate 的請求會被延遲處理。
加入 nodelay 是為了讓 burst 內的請求能夠即時被處理,而不等待速率
回到正常。
以上就是針對這個範例各個的程式碼詳細說明,
其實主要就是為了設置速率的限制參數。
而下面的內容(如測試配置,重啟使其生效),
因為跟昨天的內容都大同小異,這邊就不用來繼續水篇幅了。
小結:
這篇主要的學習內容專注在如何限制過度頻繁的請求,以避免網頁伺服器的崩潰。
其實這兩天的學習可能都不會真的實際應用到,
畢竟這次鐵人賽的重點是擺在爬蟲的執行,而非抵擋爬蟲的反爬蟲。
但我想,多了解一些多的知識,對我來說也絕對不是一件壞事,多做多學嘛。
參考資料:
https://hackmd.io/@winnienotes/SJyXK5TIj
https://medium.com/evan-fang/nginx-rate-limiting-%E4%BD%BF%E7%94%A8limit-req-zone%E4%BE%86%E9%99%90%E5%88%B6request%E9%87%8F-f72936ebbbac