NGINX Rate Limiting: 使用limit_req_zone來限制request量

Evan
evan.fang
Published in
Feb 26, 2021

若request的量太大,導致server承受不住,限制server能處理的request數量上限,有時候會是簡單而且有效的作法。

參考:Limiting the Request Rate

以下示範如何使用docker啟動一個nginx sever,並設定其能接收的request數量限制為每個ip每秒至多處理2個request,超額的request會以http status 503回應。

範例程式碼:Github

首先準備好docker-compose file:

version: "2"services:
webserver:
image: nginx
container_name: webserver
volumes:
- ./conf:/etc/nginx/conf.d
ports:
- 8080:80

注意volumes的部分,要把nginx需要的設定檔conf.d給掛進去。接下來準備設定檔default.conf

limit_req_zone $binary_remote_addr zone=reqlimit:1m rate=2r/s;# 1m: stores about 16000 ip addresses
# 2r/s: 2 requests per 1 second
server {
listen 80 default_server;
root /usr/share/nginx/html;
limit_req zone=reqlimit;
}

第一行的limit_req_zone $binary_remote_addr zone=reqlimit:1m rate=2r/s,指明了

  • 是在設定limit_req_zone
  • limit的名稱是reqlimit
  • 1m表示server記憶體要保存多少ip的request紀錄
  • 2r/s表示每秒接受兩個request

而在server的設定中,透過limit_req zone=reqlimit; 指定了limit_req要使用的限制設定名稱為reqlimit。

啟動nginx:

docker-compose up -d

訪問localhost:8080,正常的情況下,應可以看見歡迎畫面:

localhost:8080

試著快速重新整理畫面,可以看到由於時間內送出的request過多,nginx將回覆http status 503 service unavailable:

--

--