Nginx帶寬控制

jopen 9年前發布 | 11K 次閱讀 Nginx Web服務器

原文  http://huoding.com/2015/03/20/423


有個老項目,通過 Squid 提供文件下載功能,利用 delay_parameters 實現帶寬控制,問題是我玩不轉 Squid,于是盤算著是不是能在 Nginx 里找到類似的功能。

好消息是 Nginx 提供了 limit_rate 和  limit_rate_after ,舉個例子來說明一下:

location /download/ {
    limit_rate_after 500k; limit_rate 50k;
}

大概意思是:用戶下載達到 500k 后,便控制其速度在 50k 以內。

壞消息是此控制是針對單個連接而言的。換言之,只能限制單個連接的帶寬,不能限制總帶寬。不過使用 limit_conn 模塊的話,可以在一定程度上緩解問題:

limit_conn_zone $server_name zone=servers:10m;

server { location /download/ { limit_conn servers 1000;</span> limit_rate_after 500k; limit_rate 50k; } }</pre>

通過 limit_conn 限制了并發連接數,于是也就限制了總帶寬。可惜這個解決方式并不完美,大家可以設想如下的例子:1000 個用戶能夠同時以 50k 的速度下載;那么在總帶寬不變的情況下,2000 個用戶是否能夠同時以 25k 的速度下載?從業務的角度看,答案自然是肯定的,可實際上 limit_conn 和 limit_rate 不夠靈活,無法簡單實現此類邏輯。

當然,問題肯定有辦法解決。比如使用第三方模塊: limit_speed ;還可以使用 Linux 內置的 TC 命令。limit_speed 比較簡單,不多說了,接下來我們就看看 TC 的用法吧:

shell> tc qdisc add dev eth0 root handle 1: htb default 10
shell> tc class add dev eth0 parent 1: classid 1:1 htb rate 10mbit
shell> tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 \
       match ip dport 80 0xffff flowid 1:1

TC 復雜的讓人發瘋,請參考: Linux Advanced Routing & Traffic Control HOWTO

本文介紹了多個 Nginx 限制訪問 方面的模塊,實際上還有一個  limit_req 模塊也超贊,雖然和本文關系不大,但建議大家了解,具體可以參考「 nginx limit_req限速設置 」。

</div> </div>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!