2016-09-14 60 views
1

我發現ngx_http_limit_req_module可用於限制每次請求的最大數量。但在我的理解中,這適用於整個虛擬位置。我想要的是限制每個任意URL的速率。nginx - 包含變量的URL的限制請求率

示例: 我希望在客戶端發出一個請求後,要求在特定客戶端阻塞特定客戶端的請求時間爲/api/list/1/votes。但是,他仍然可以撥打/api/list/2/votes(但在呼叫之後,/2路線應該被阻止幾秒鐘)。 我最初的想法是使用正則表達式來定義每條路線的位置,以/votes結尾,但比(在該示例中)/1/2將被阻塞,這不是我想要的。

任何想法?

+0

您可以鏈接位置塊。 – Smar

+0

我不認爲這是一個選項,因爲潛在路線的數量是無限的,因爲id(上例中的1和2)是一個變量。 – n1try

回答

0

可以nginx的配置設置爲這樣的事情

limit_req_zone $binary_remote_addr zone=votes:10m rate=1r/s; 

location ~* ^/api/list/([0-9])/votes$ { 
    # apply rate limiting 
    limit_req zone=votes burst=5; 
} 

zone=votes:10m指定創建一個名爲「投票」來存儲日誌訪問速度的限制網址的IP地址的共享內存區。我們設置rate=1r/s來指定每秒只允許從該IP提供一個請求。突發參數告訴Nginx如果超過5個隊列從一個特定的IP開始丟棄請求。我已經放置的正則表達式([0-9])可以用任何符合你的路由的正則表達式替換。

請參閱this關於限制請求率的更多博客文章。

+0

這不會阻止來自客戶端的所有與該正則表達式匹配的請求嗎?參考上面的例子,我認爲你的解決方案也會在調用'/ api/list/1/votes'之後阻止對'/ api/list/2/votes'的請求。 – n1try