Rate limiting with NGIX - The first sight
Rate Limiting with NGINX
可以用於安全性上,藉由限制使用者針對同一個URL的行為來對付暴力破解密碼的request、DDoS攻擊。一般來說,也要保護upstream的application避免同時接受大量的請求。
以NGINX 為例,他用的是leaky bucket algorithm,在通訊交換很常見的方式。假設水桶有洞,注入的水的速度大於滴出的速度,則會溢出。就像client進行http request,server 針對requests first-in-first-out 處理,太多請求太多請求超出緩衝區(bucket)就會丟棄請求。
幾個指令簡單介紹
limit_req_zone 設定共享記憶體大小和限制速度,但這沒有限制限制請求範圍。因此需要再深入設定location或server去限制特定請求,例如在 /login/ 的請求下才起用此設定。
處理突發
如果在限制內收到2個請求,第二個請求會被返回503 error code。理想狀態可有個緩衝並且即時做服務,這時候需要burst參數來設定。在前一個請求時間限制內來的第二個請求就會放置queue中,burst為記憶體大小。當burst滿了,除了第一筆資料先打到upstream, 後面的就放入原本bucket的queue中。當排隊超過burst大小還是會發生503。
若在burst加上nodelay,則會在burst滿了之後一次性的把request倒進bucket,如果burst中所有request都同時到達,那將只會有第一個request會被處理。
使用limit_req的延遲參數delay去達成兩階段 rate limit。例如在一個網站有4個 resource per pages,最多12狀況下,rate limit = 5 request /s , burst = 12, delay = 8 讓前8個在burst的request不delay, 後面的request按照rate limit速度打,溢出則丟棄。
reference:
留言
張貼留言