作者 主題: 讓 mod_cband 在某些條件下不設限  (閱讀 8572 次)

0 會員 與 1 訪客 正在閱讀本文。

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5384
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
讓 mod_cband 在某些條件下不設限
« 於: 2006-03-15 16:13 »
話說自從把 apache 由 1.3 換成 2.0 之後, 原本我使用的 mod_throttlemod_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>