若request的量太大,導致server承受不住,限制server能處理的request數量上限,有時候會是簡單而且有效的作法。
以下示範如何使用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 secondserver {
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,正常的情況下,應可以看見歡迎畫面:
試著快速重新整理畫面,可以看到由於時間內送出的request過多,nginx將回覆http status 503 service unavailable: