話說自從把 apache 由 1.3 換成 2.0 之後, 原本我使用的
mod_throttle 與
mod_bandwidth 就不能使用了. 不久前, 發現有些使用者放了一個大的檔案上來, 結果.... 把我小小的 1M 上傳頻寬都給吃光了, 所以完全沒有限制, 對我使用的 ADSL 來說, 實在不是件好事.
找了一下在 Apache2 中的相關模組, 發現有個
mod_cband 似乎可以用來取代上述兩個在 1.3 時所用的模組. 設定並不會很複雜, 下載後就裝起來用了. 運作也十分正常.
不過上星期回家時, 老婆抱怨由網站看我們拍的影像檔時, 速度很慢. 我試了一下, 果然... 這個 mod_cband 連我們 local 網路也限速了.
我原本的設定是:
<IfModule mod_cband.c>
<Location /cband-status>
SetHandler cband-status
</Location>
<Location /cband-status-me>
SetHandler cband-status-me
</Location>
<CBandClass local_class>
CBandClassDst 127/8
CBandClassDst 192.168.0.0/24
</CBandClass>
</IfModule>
<IfModule mod_cband.c>
CBandSpeed 800 200 200
CBandRemoteSpeed 500 50 50
CBandClassRemoteSpeed local_class 1Gbps 1000 1000
CBandLimit 10G
CBandExceededSpeed 10 3 3
CBandPeriod 1W
CBandScoreboard /var/run/apache2/default.scoreboard
</IfModule>
以為這樣的設定, 可以讓這個 virtualhost 的限制如下:
1. 每個 IP 的速度是 500bps
2. local_class 裡的機器連線是 1Gbps
3. 整個 virtualhost 的限制是 800bps.
不過, 實際上, mod_cband 仍會因為超過整個 virtualhost 的 800bps 限制, 而讓 local_class 的設定失效. 為了避免這個問題, 我必須把 CBandSpeed 也改成 1Gbps, 不過, 這樣子雖然可以讓我在 local_class 的機器下載速度達到 1Gbps, 不過, 也表示整個 virtualhost 的限制也變成 1Gbps, 如果同時有數個 ip 連線來抓資料, 每個 ip 的限制雖然是 500bps, 加起來, 仍會用掉我所有的上傳頻寬.
所以, 就改了一下 mod_cband.c 的內容:
--- mod_cband.c.orig 2006-03-15 15:00:31.870512882 +0800
+++ mod_cband.c 2006-03-15 15:30:53.494343139 +0800
@@ -3438,6 +3438,8 @@
not_limit = 0;
if ((mod_cband_get_shared_speed_lock(entry, entry_user) < 0) && (max_remote_kbps == 0))
not_limit = 1;
+ // if max_remote_kbps > 9xxGbps (set to 1000Gbps), we assume it is no any speed limit.
+ if (max_remote_kbps > 1000000000) not_limit = 1;
mod_cband_change_total_connections_lock(entry, entry_user, 1);
mod_cband_change_remote_connections_lock(remote_idx, 1);
這個 patch 也可以由這兒抓取:
http://www.teatime.com.tw/~tommy/mypatch/mod_cband_nolimit.patch經過這樣的修正, 只要我把限制設定為 1000Gbps 或更大的數字時, 就表示不要有任何的限制. 所以我可以用下面的設定來達到我要的功能了:
IfModule mod_cband.c>
<Location /cband-status>
SetHandler cband-status
</Location>
<Location /cband-status-me>
SetHandler cband-status-me
</Location>
<CBandClass local_class>
CBandClassDst 127/8
CBandClassDst 192.168.0.0/24
</CBandClass>
</IfModule> <IfModule mod_cband.c>
CBandSpeed 800 200 200
CBandRemoteSpeed 500 50 50
CBandClassRemoteSpeed local_class 1000Gbps 1000 1000
CBandLimit 10G
CBandExceededSpeed 10 3 3
CBandPeriod 1W
CBandScoreboard /var/run/apache2/default.scoreboard
</IfModule>