Linux/CentOS2012. 3. 8. 14:26
Apache 1.x 버전에서는 아래와 같이 mod_throttle 모듈과 mod_bandwidth 모듈을 통해 트래픽 제어를 할 수 있었다.

Apache + Throttle(mod_throttle) 을 이용해서 트래픽정보를 구합니다.

[Throttle Status]
http://자신의도메인/throttle-me
실시간으로 볼 수 있으며 자신의 일일 트래픽량이 증가시 웹서버에서 Throttle 연동해 있기 때문에 초과시 자동적으
로 트래픽량 초과 안내 페이지가 나오면 일일 트래픽량으로 제한이므로 하루가 지나면 다시 초기화로 다시 계산해서
그 정보가 계산됩니다.

% - 허용된 트래픽에서 몇퍼센트를 사용
Hits - 도메인의 히트수
Refused - 트래픽이 초과하였을때 접속하여 요청거부된 횟수
KBytes Sents - 회원님의 도메인 트래픽량
KBytes Per Hits - 한 히트당 트래픽량의 평균치
Polocy - Volume 트래픽 제한을 양으로 계산
Limits - 트래픽 제한양 제한선 입니다.
Period - 1d 하루 24시간을 기준으로 트래픽을 계산한다는 뜻입니다.
Period Elapsed - 24시간중 소요된 시간
Idle time - 최종 히트후 요청 대기시간

참조 사이트 : 
http://www.snert.com/Software/mod_throttle/

##############
## 설치하기 ##
##############

일반적으로 아파치에서 mod_throttle 을 연동하기 위해서는 2가지 방식의 컴파일을 지원하지만 여기서는
DSO 방식으로 설치하도록 한다.

---------------------------------------------------------------------
STATIC 방식 (APACHE mod_throttle 부분)

./configure --disable-shared=throttle
--add-module=/usr/local/mod_throttle-3.1/mod_throttle.c

---------------------------------------------------------------------
DSO 방식

cd /usr/local/mod_throttle-3.1
make install
mod_throttle.so를 apache디렉토리 libexec안에 복사해줍니다.
그런후 httpd.conf에 mod_throttle부분을 수정.
(compile시 apxs에 위치를 Makefile안에 전체경로로 변경후 make하세요.)
LoadModule throttle_module libexec/mod_throttle.so
AddModule mod_throttle.c
---------------------------------------------------------------------

아파치에서 mod_throttle 을 설치하기 위한 순서

1. 다운로드
2. 컴파일 / 설치
3. apache 설정파일 내부에서의 mod_throttle 부분을 인식
4. 버츄얼 호스팅 부분의 각 사용자마다 각각 트래픽 제어
5. 트래픽확인

■ 다운로드
[root@www download]# wget
http://www.snert.com/Software/mod_throttle/mod_throttle312.tgz
[root@www download]# tar xzf mod_throttle312.tgz
[root@www download]# cd mod_throttle-3.1.2/
[root@www mod_throttle-3.1.2]# ll
total 188
-rw-r--r--  1 111 users  7233 Dec  3  2000 CHANGES.txt
drwxr-xr-x  2 111 users  4096 Dec  2  2000 Img
-rw-r--r--  1 111 users  1525 Dec  2  2000 LICENSE.txt
-rw-r--r--  1 111 users  1009 Dec  2  2000 Makefile
-rw-r--r--  1 111 users 26492 Dec  3  2000 index.shtml
-rw-r--r--  1 111 users 97711 Dec  3  2000 mod_throttle.c
-rw-r--r--  1 111 users   277 Dec  2  2000 patch.proxy_util.c
-rw-r--r--  1 111 users     4 Dec  3  2000 version3.cnt

■ 컴파일 / 설치
[root@www mod_throttle-3.1.2]# make install
apxs -c    mod_throttle.c
gcc -DLINUX=22 -DHAVE_SET_DUMPABLE -DUSE_HSREGEX -fpic -DSHARED_MODULE -
I/usr/local/apache2/include  -c mod_throttle.c
gcc -shared -o mod_throttle.so mod_throttle.o
apxs -i -a -n 'throttle' mod_throttle.so
[activating module `throttle' in /usr/local/apache2/conf/httpd.conf]
cp mod_throttle.so /usr/local/apache2/libexec/mod_throttle.so
chmod 755 /usr/local/apache2/libexec/mod_throttle.so
cp /usr/local/apache2/conf/httpd.conf /usr/local/apache2/conf/httpd.conf.bak
cp /usr/local/apache2/conf/httpd.conf.new /usr/local/apache2/conf/httpd.conf
rm /usr/local/apache2/conf/httpd.conf.new
root@www mod_throttle-3.1.2]# apachectl restart


■ apache 설정파일 내부에서의 mod_throttle 부분을 인식

<IfModule mod_throttle.c>
# 트래픽이 초과되면 나오는 에러페이지
ErrorDocument 503
http://192.168.1.1/error/error.html
ThrottlePolicy none

<Location /throttle-status>
SetHandler throttle-status
Deny from all
# 다른접근을 모두 거부하고 특정 아이피에서만 throttle-status 를 확인 하도록 설정
# 여기서는 192.168.1.1 과 192.168.1.2 의 IP 주소만 접근할 수 있다.
Allow from 192.168.1.1
Allow from 192.168.1.2
</Location>

<Location /throttle-me>
SetHandler throttle-me
</Location>
<Location /~*/throttle-me>
Order deny,allow
Deny from all
Allow from all
SetHandler throttle-me
</Location>
</IfModule>

■ 버츄얼 호스팅 부분의 각 사용자마다 각각 트래픽 제어

  트래픽을 걸때의 여러가지 방법이 존재한다.
  ThrottlePolicy Volume 100M 1d //하루 100M
  ThrottlePolicy Request 1000 1d //하루 천번
  ThrottleClientIP 1100 volume 2 10   //로그 1100k

<VirtualHost 192.168.1.1>
    ServerName test1.com
    DocumentRoot /home/test1/pubic_html
   
    # 전송량 1일 300M
    ThrottlePolicy Volume 300M 1d 
</VirtualHost>
<VirtualHost 192.168.1.1>
    ServerAdmin
webmaster at test2.com
    DocumentRoot /home/test2/public_html
    ServerName  test2.com
   
    # 전송량 1일 400M
    ThrottlePolicy Volume 400M 1d
</VirtualHost>
<VirtualHost 192.168.1.1>
    ServerAdmin
webmaster at test3.org
    DocumentRoot /home/test3/public_html
    ServerName  test3.org
   
    # 전송량 1일 500M
    ThrottlePolicy Volume 500M 1d
</VirtualHost>

■ 트래픽확인

1. 첫번째방법은 자신의 트래픽만 보는 방법 ( 일반 사용자인 경우 )

http://자신의도메인/throttle-me

2. 두번째방법은 모든 가상호스트를 보는 방법 ( 관리자인 경우 )
( ※ 중요!!! 이때는 아무나 접근할 수 없도록 접근 IP 막는 조치를 취해야 한다. 그렇지 않으면 모든 사용자의
     정보를 다른 사용자가 볼 수도 있고 트래픽을 초기화 할 수도 있다. )

http://자신의도메인/throttle-status


하지만, Apache2로 넘어오면서 mod_throttle 모듈이나 mod_bandwidth 모듈을 더 이상 사용할 수 없게 된다.

대신 mod_cband 모듈이라는 걸출한 녀석을 사용할 수 있다. mod_cband 모듈을 통해 트래픽 제한과 대역폭 제한, 그리고 트래픽 제한 결과 등을 웹을 통해 확인할 수 있게 된다.

Debian에서는 libapache2-mod-cband 패키지가 있으므로, 소스 컴파일할 필요 없이 패키지를 설치하면 된다. 현재 libapache2-mod-cband 패키지의 mod_cband 모듈 버전은 0.9.7.4 이다.

# apt-get install libapache2-mod-cband


만약 최신 버전을 설치하고 싶다면, 소스 파일을 구해 컴파일하면 된다.

출처:
http://linux.tini4u.net

os: centos4.6

아파치 2.x에서는 cband 모듈을 이용함으로써 두가지의 기능을 모두 사용할 수 있습니다.
또한 xml 형태로의 데이터까지 얻을 수 있기 때문에 관리자 입장에서 매우 반가울 수 밖에 없습니다.

1. mod_cband 설치 (최신버전:
http://cband.linux.pl/)
http://www.sfr-fresh.com/unix/privat/mod-cband-0.9.7.5.tgz/


[root@manage src]# wget http://www.sfr-fresh.com/unix/privat/mod-cband-0.9.7.5.tgz
[root@manage src]# tar xvzfp mod-cband-0.9.7.5.tgz
[root@manage src]# cd mod-cband-0.9.7.5
[root@manage mod-cband-0.9.7.5]# ./configure --with-apxs=/usr/local/apache/bin/apxs
[root@manage mod-cband-0.9.7.5]# make
[root@manage mod-cband-0.9.7.5]# make install 수행 시에 아래와 같은 오류가 발생하는 경우,
...
src/mod_cband.c:1365: error: 'struct conn_rec' has no member named 'remote_addr'
apxs:Error: Command failed with rc=65536
.
make: *** [src/.libs/mod_cband.so] \uc624\ub958 1
apache 버전이 2.2 버전대가 아닌, httpd-2.4.1 버전인 관계로 발생하므로
아래와 같이 - 부분을 + 부분으로 수정 후, 저장하여, configure, make, make install을 재수행하면, 정상처리된다. 
# vi ./src/mod_cband.c
이때,  ./src/.libs/mod_cband.c 라는 파일이 존재하지 않는 상태에서 수행해야 한다.
  1. --- mod-cband-0.9.6.1/src/mod_cband.c   2006-01-21 20:23:27.000000000 -0500
  2. +++ mod-cband-0.9.6.1-cov//src/mod_cband.c      2012-02-22 19:23:04.162307962 -0500
  3. @@ -1278,7 +1278,7 @@
  4.      p.bitlen = 32;
  5.      p.ref_count = 0;
  6.      p.family = AF_INET;
  7. -    p.add.sin.s_addr = inet_addr(r->connection->remote_ip);
  8. +    p.add.sin.s_addr = inet_addr(r->connection->client_ip);
  9.                     
  10.      node = patricia_search_best(config->tree, &p);
  11.                                 
  12. @@ -1287,7 +1287,7 @@
  13.                                                
  14.          if (leaf) {
  15.  #ifdef DEBUG
  16. -            fprintf(stderr,"%s leaf %s\n",r->connection->remote_ip,leaf);
  17. +            fprintf(stderr,"%s leaf %s\n",r->connection->client_ip,leaf);
  18.              fflush(stderr);
  19.  #endif
  20.             return atoi(leaf);
  21. @@ -1307,10 +1307,10 @@
  22.      if (entry == NULL)
  23.         return -1;
  24.      
  25. -    if (c->remote_ip != NULL)
  26. -       addr = inet_addr(c->remote_ip);   
  27. +    if (c->client_ip != NULL)
  28. +       addr = inet_addr(c->client_ip);   
  29.      else
  30. -       addr = c->remote_addr->sa.sin.sin_addr.s_addr;
  31. +       addr = c->client_addr->sa.sin.sin_addr.s_addr;
  32.         
  33.      time_now = apr_time_now();     
  34.      hosts = config->remote_hosts.hosts;
#make
...
write "make install" to install module
#make install
...
chmod 755 /usr/local/apache/modules/mod_cband.so
#


2. 아파치 환경설정에서의 cband 설정
cband 모듈 또한 throttle와 마찬가지로 3rd-party 모듈이기 때문에 아파치에서 설정을 합니다.
  1. [root@localhost]# vi /usr/local/apache/conf/httpd.conf
  2. <IfModule mod_cband.c>
  3.     <Location /cband-status>
  4.         SetHandler cband-status
  5.         Order Deny,Allow
  6.         Deny from All
  7.         Allow from 127.0.0.1 100.100.100.100
  8.     </Location>

  9.     <Location /cband-me>
  10.         SetHandler cband-status-me
  11.         Order deny,allow
  12.         Deny from all
  13.         Allow from all
  14.     </Location>
  15. </IfModule>

※ SetHandler 설명
cband-status -> 관리자 페이지 입니다. 따라서 접근을 허용할 IP를 입력해주셔야 됩니다.
cband-me -> 사용자 페이지 입니다.

3. cband 적용
cband는 각 호스트에 대해서 여러가지 지시자를 사용하여 설정 할 수 있습니다.
아래는 여러가지 지시자중 하나인 가장 많이 사용되는 CbandLimit을 사용한 예제 입니다.
  1. ※ 각각의 호스트에 따로따로 설정해줄 때
  2. <VirtualHost 192.168.0.1>
  3.     ServerName foobar.com
  4.     ServerAlias www.foobar.com
  5.     DocumentRoot /home/foobar/public_html
  6.     ErrorLog logs/foobar-err
  7.     CustomLog logs/foobar-acc combined
  8.     CBandLimit 100Mi
  9.     CBandPeriod 1D
  10. </VirtualHost>

※ 위 설정은 1Day 동안 100M의 트래픽을 허용하겠다는 설정입니다.

  1. ※ 하나의 유저(foobar)가 여러개의 호스트를 사용하고 있는 경우 (트래픽 공유)
  2. <CBandUser foobar>
  3.     CBandUserLimit 100Mi
  4.     CBandUserPeriod 1D
  5. </CBandUser>

  6. <VirtualHost 192.168.0.1>
  7.     ServerName foobar.com
  8.     ServerAlias www.foobar.com
  9.     DocumentRoot /home/foobar/public_html
  10.     ErrorLog logs/foobar-err
  11.     CustomLog logs/foobar-acc combined
  12.     CBandUser foobar
  13. </VirtualHost>

  14. <VirtualHost 192.168.0.1>
  15.     ServerName foobar2.com
  16.     ServerAlias www.foobar2.com
  17.     DocumentRoot /home/foobar2/public_html
  18.     ErrorLog logs/foobar2-err
  19.     CustomLog logs/foobar2-acc combined
  20.     CBandUser foobar
  21. </VirtualHost>

※ 위 설정은 foobar 유저에게 1Day 동안 100M의 트래픽을 허용하겠다는 설정이며,
foobar.com과 foobar2.com에서 foobar 유저의 트래픽을 공유해서 사용하겠다는 것입니다.

4. cband 단위
- 전송속도 단위
kbps, Mbps, Gbps - bits per second, 의미: 1024, 1024*1024, 1024*1024*1024 bps
kb/s, Mb/s, Gb/s - bytes per second, 의미: 1024, 1024*1024, 1024*1024*1024 b/s
기본값 : kbps

- 트래픽 제한 단위
K, M, G - bytes, 의미: 1000, 1000*1000, 1000*1000*1000 bytes
Ki, Mi, Gi - bytes, 의미: 1024, 1024*1024, 1024*1024*1024 bytes
기본값: K

- 시간 단위
S, M, H, D, W - 초, 분, 시간, 일, 주. 의미: 1, 60, 3600, 86400, 604800 Seconds
기본값: S


5. cband 지시자
이름: CBandDefaultExceededURL
설명: 제한을 초과했을때 보여줄 URL
문맥: Server config
문법: CBandDefaultExceededURL [URL]
예제: CBandDefaultExceededURL
http://foobar.com/503.html

이름: CBandDefaultExceededCode
설명: 제한을 초과했을시 보여줄 에러 코드
문맥: Server config
문법: CBandDefaultExceededCode [HTTP_CODE]
예제: CBandDefaultExceededCode 509

이름: CBandScoreFlushPeriod
설명: scoreboard 파일에 기록할 요청수를 정하나, cband 퍼포먼스에 영향을 미칩니다.
기본값: 1
문맥: Server config
문법: CBandScoreFlushPeriod [요청수]
예제: CBandScoreFlushPeriod 100
    100번의 요청이 들어오면 scoreboard 파일에 한번 기록합니다.

이름: CBandSpeed
설명: 가상호스트 도메인의 최대 속도, 요청수, 접속수 설정
문맥: <Virtualhost>
문법: CBandSpeed [kbps] [rps] [max_conn]
    kbps - 초당 최대 전송속도
    rps - 초당 최대 요청수
    max_conn - 최대 동시 접속수
예제: CBandSpeed 1024 10 30
    호스트에 대해 1024kbps 전송속도로 제한하며, 초당 10개의 요청을 처리하고,
    동시 접속을 30개로 제한합니다.

이름: CBandRemoteSpeed
설명: 호스트 접속자의 최대속도, 요청수, 접속수 제한
문맥: <Virtualhost>
문법: CBandRemoteSpeed [kbps] [rps] [max_conn]
    kbps - 초당 최대 전송속도
    rps - 초당 최대 요청수
    max_conn - 최대 동시 접속수
예제: CBandRemoteSpeed 20kb/s 3 3
    호스트 접속자에 대해 1024kbps 전송속도로 제한하며,
    초당 10개의 요청을 처리하고, 동시 접속을 30개로 제한합니다.

이름: CBandClassRemoteSpeed
설명: IP class의 최대속도, 요청수, 접속수 제한
문맥: <Virtualhost>
문법: CBandClassRemoteSpeed [class_name] [kbps] [rps]
    kbps - 초당 최대 전송속도
    rps - 초당 최대 요청수
    max_conn - 최대 동시 접속수
예제:
<CBandClass googlebot_class>
  CBandClassDst 66.249.64/24
  CBandClassDst 66.249.65/24
  CBandClassDst 66.249.79/24
</CBandClass>
CBandClassRemoteSpeed googlebot_class 20kb/s 2 3
googlebot_class 클래스에 대해 20kb/s 전송속도로 제한하며,
초당 10개의 요청을 처리하고, 동시 접속을 30개로 제한합니다.

이름: CBandRandomPulse
설명: 속도 제한을 위해서 임의의 파형을 생성한 다음 처리하는 방법입니다.
문맥: Global
문법: CBandRandomPulse [On/Off]
예제: CBandRandomPulse On

이름: CBandLimit
설명: 제한할 전송량을 설정한다.
문맥: <Virtualhost>
문법: CBandLimit [limit]
    limit - 전송량, 사용단위: K(kilo), M(mega), G(giga), Ki(kibi), Mi(mebi), Gi(gibi)
예제: CBandLimit 10M
    전송량을 10M(10*1000*1000bytes)로 제한한다.
    CBandLimit 10Mi
    전송량을 10M(10*1024*1024bytes)로 제한한다.

이름: CBandClassLimit
설명: IP class에 대해 제한할 전송량 설정
문맥: <Virtualhost>
문법: CBandClassLimit [class_name limit]
    class_name - 클래스 이름
    limit - 전송량, 사용단위: K(kilo), M(mega), G(giga), Ki(kibi), Mi(mebi), Gi(gibi)

이름: CBandExceededURL
설명: 제한을 초과했을때 보여줄 URL
문맥: <Virtualhost>
문법: CBandExceededURL [URL]
예제: CBandExceededURL
http://foobar.com/503.html

이름 : CBandExceededSpeed
설명: 전송량을 초과했을때의 전송속도 제한 설정
문맥: <Virtualhost>
문법: CBandExceededSpeed [kbps] [rps] [max_conn]
    kbps - 초당 최대 전송속도
    rps - 초당 최대 요청수
    max_conn - 최대 동시 접속수

이름: CBandScoreboard
설명: 가상호스트의 scoreboard 파일 지정
문맥: <Virtualhost>
문법: CBandScoreboard [path]

이름: CBandPeriod
설명: 제한기간
문맥: <Virtualhost>
문법: CBandPeriod [period]
    period - 사용단위: S(초), M(분), H(시간), D(일), W(주)
예제: CBandPeriod 1D

이름 : CBandPeriodSlice
설명: 기간을 나눌 기간 명시
기본값: slice_len = limit
문법: CBandPeriodSlice [slice_length]
예제: CBandLimit 100G
    CBandPeriod 4W
    CBandPeriodSlice 1W
지정된 제한값을 1주일 단위로 나누어 사용 합니다.
위 설정을 해석하면 4주는 1주일 단위로 나누며, 용량은 100G/4주=25G로 사용 합니다.

이름: <CBandUser>
설명: 새로운 cband 가상 사용자 설정
문맥: Server config
문법: <CBandUser user_name>

이름: CBandUserSpeed
설명: cband 가상 사용자의 속도, 요청수, 동시 접속수 제한
문맥: <CBandUser>
문법: CBandUserSpeed [kbps] [rps] [max_conn]
    kbps - 초당 최대 전송속도
    rps - 초당 최대 요청수
    max_conn - 최대 동시 접속수
예제: CBandUserSpeed 100kb/s 10 5

이름: CBandUserLimit
설명: cband 가상 사용자의 전송 용량 제한
문맥: <CBandUser>
문법: CBandUserLimit [limit]
    limit - 사용용량, 사용단위: K(kilo), M(mega), G(giga), Ki(kibi), Mi(mebi), Gi(gibi)
예제: CBandUserLimit 10M
    전송량을 10M(10*1000*1000bytes)로 제한한다.
    CBandUserLimit 10Mi
    전송량을 10M(10*1024*1024bytes)로 제한한다.

이름: CBandUserClassLimit
설명: cband 가상 사용자의 IP class에 대해 제한할 전송량 설정
문맥: <CBandUser>
문법: CBandUserClassLimit [class_name] [limit]
    class_name - 클래스 이름
    limit - 전송량, 사용단위: K(kilo), M(mega), G(giga), Ki(kibi), Mi(mebi), Gi(gibi)

이름 : CBandUserExceededURL
설명: cband 가상 사용자의 제한을 초과했을때 보여줄 URL
문맥: <CBandUser>
문법: CBandUserExceededURL URL
예제: CBandDefaultExceededURL
http://foobar.com/503.html

이름: CBandUserExceededSpeed
설명: cband 가상 사용자의 전송량을 초과했을때의 전송속도 제한 설정
문맥: <CBandUser>
문법: CBandUserExceededSpeed [kbps] [rps] [max_conn]
    kbps - 초당 최대 전송속도
    rps - 초당 최대 요청수
    max_conn - 최대 동시 접속수

이름: CBandUserScoreboard
설명: cband 가상 사용자의 scoreboard 파일 지정
문맥: <CBandUser>
문법: CBandUserScoreboard [path]

이름: CBandUserPeriod
설명: cband 가상 사용자의 제한기간
문맥: <CBandUser>
문법: CBandUserPeriod [period]
    period - 사용단위: S(초), M(분), H(시간), D(일), W(주)
예제: CBandPeriod 1D

이름: CBandUserPeriodSlice
설명: cband 가상 사용자의 기간을 나눌 기간 명시
기본값: slice_len = limit
문맥: <CBandUser>
문법: CBandUserPeriodSlice [slice_length]
예제: CBandLimit 100G
    CBandPeriod 4W
    CBandPeriodSlice 1W
지정된 제한값을 1주일 단위로 나누어 사용 합니다.
위 설정을 해석하면 4주는 1주일 단위로 나누며, 용량은 100G/4주=25G로 사용 합니다.


6. 통계화면 보기
관리자모드 -
http://foobar.com/cband-status
관리자모드(xml) - http://foobar.com/cband-status?xml
사용자모드 - http://foobar.com/cband-me
사용자모드(xml) - http://foobar.com/cband-me?xml

7. 통계화면에 아파치 인증 걸기
throttle 강좌에서도 말씀드렸지만 통계화면의 제한은 IP의 형태로 제한을 하는게 정설입니다.
그렇지만 IP가 자주 변경되는 분들은 매번 IP를 변경해주는것도 하나의 일이 될 수 있습니다.
따라서 이런 경우에는 아파치 인증을 걸어서 사용하시면 편리할 것입니다.
  1. [root@localhost]# vi /etc/httpd/conf/httpd.conf
  2. <IfModule mod_cband.c>
  3.     <Location /cband-status>
  4.         SetHandler cband-status
  5.         AuthName "트래픽관리 페이지"
  6.         AuthType Basic
  7.         AuthUserFile /home/foobar/.htpasswd
  8.         require valid-user
  9.     </Location>

  10.     <Location /cband-me>
  11.         SetHandler cband-status-me
  12.         Order deny,allow
  13.         Deny from all
  14.         Allow from all
  15.     </Location>
  16. </IfModule>
  17. [root@localhost]# htpasswd -c /home/foobar/.htpasswd ID


mod_cband(아파치2의 트래픽 제어모듈 like mod_throttle&mod_bandwidth)


0. 내가 원한는 것?
  예전에 apache 1은 mod_throttle으 로 가상호스트별 트래픽 측정 및 제한이 가능했습니다.
이 트래픽 제한 기능은 호스팅을 하기위해서는 필수입니다. 어떤 도메인에서 많이 사용하는지
아는 것은 아주 중요한 일이기 때문입니다. 하지만,
 apache2를 쓰면 이놈을 포기할 수 밖에 없었습니다. 검색하다 .. cband를 찾았습니다.
 mod_throttle과 기능및 구조 거의 흡사하며, mod_bandwidth의 기능까지 포함했고,
최근에 개발되어 계속 성능 향상이 되어 가고 있었습니다.
보다 좋은건, ?xml 이라고 붙여주면, 데이터를 xml형태로 얻을 수 있어,
호스팅 하기에 정말 좋은 모듈입니다.
 [주의] cband는 apache 2 모듈이다. apache 1.3.XX용이 아니며 1.3.XX는 mod_throttle을 사용하세요!!

 [주요기능]
    * Apache2용 가볍운 트래픽제한 모듈
    * 사용자별 대역폭제한 기능
    * 가상호스트별 대역폭 제한 기능
    * 목적지별 대역폭 제한 기능
    * 제한기능:
          o 모든사용자 대역폭 제한
          o 다운로드 속제 제한
          o 초당요청수 제한
          o 아이피대역별 제한
    * Support for virtualhosts
    * Support for defined users
    * 제한결과 웹을 통한 확인 (/cband-status)
    * 각 사용자별 제한 결과 확인(/cband-status-me)



1. 설치방법
  cd /usr/local
  wget http://cband.linux.pl/download/mod-cband-0.9.7.4.tgz
  tar xvfpz mod-cband-0.9.7.4.tgz
  cd mod-cband-0.9.7.4
  ./configure --with-apxs=/usr/local/apache/bin/apxs
  ## 옵션설명
  ## --with-apxs=/usr/local/apache/bin/apxs : 아파치 apxs경로를 지정합니다.
  make
  make install



2. 설치확인
  - httpd.conf 파일에
     LoadModule cband_module       modules/mod_cband.so
   줄이 추가된것을 볼 수 있습니다.
  - 아파치/modules 디렉토리에
      mod_cband.so
    파일이 추가 된 것을 볼수 있습니다.


3. 기본 설정

====================================
  <Location /cband-status>
     SetHandler cband-status
     Order deny,allow
     Deny from all
     Allow from 열어줄아이피
  </Location>

  <Location /cband-status-me>
    SetHandler cband-status-me
  </Location>

<VirtualHost *>
   ServerName gnux.co.kr    
   Document /home/gnux/www
    CBandLimit 300Mi
   CBandPeriod 1D
   CBandExceededURL http://manager.gnux.co.kr/traffic_exceeded.html
</VirtualHost>
======================================
위 설정파일은 gnux.co.kr 도메인에
하루에 300M(300*1024*1024byte)의 트래픽을 제공하는 설정입니다.
bit로 따지면, 2.4Gbit/일 트래픽을 제공하는 것입니다.
만약 하루에 300M를 초과했다면, "http://manager.gnux.co.kr/traffic_exceeded.html"
페이지가 뜨며, 지정하지 않았다면, 503 에러 페이지가 뜨게됩니다.
 만약!. 제한을 하지 않고 관찰만 하려 한다면, CBandPeriod 부분만 남기고 삭제합니다.




4. 상황별 설정
 1) 자료실 속도 제한
==============================
<VirtualHost *>
   ServerName file.gnux.co.kr    
   Document /home/gnux/file
   CBandSpeed 1024 10 30
   CBandRemoteSpeed 20kb/s 3 30
</VirtualHost>
==============================
위 설정은  file.gnux.co.kr 도메인에 대해서
속도를 1024kbps 로 제한하며, 초당 10번의 연결,
동시접속자를 30으로 제한하는 예제입니다.



 2) 사용자 일트래픽 제공 및 초과시 연결수 제한.
==============================
<VirtualHost *>
   ServerName doly.gnux.co.kr    
   Document /home/gnux/doly
   CBandLimit 100Mi
   CBandExceededSpeed 128 5 15
   CBandPeriod 1D
</VirtualHost>
==============================
위 설정은 doly.gnux.co.kr도메인에 대해
하루에 100Mbyte의 트레픽을 제공하며,
100M를 초가했다면,
속도를 128bps로 제한, 초당 5번의 연결,
동시접속자를 15로 제한하는 예제입니다.



 3) 한 사용자에 여러 도메인이 있다면?
==============================
<CBandUser host_user1>
    CBandUserLimit 100Mi
    CBandUserPeriod 1D
</CBandUser>
<VirtualHost *>
   ServerName aaa.co.kr    
   Document /home/host_user1/aaa
   CBandUser host_user1
</VirtualHost>
<VirtualHost *>
   ServerName bbb.co.kr    
   Document /home/host_user1/bbb
   CBandUser host_user1
</VirtualHost>
==============================
위 설정은 host_user1이라는 가상 사용자를 지정한다음.
그 사용자는 하루에 100Mbyte를 사용할수 있게합니다.
그런다음, aaa.co.kr, bbb.co.kr 모두 host_user1의
트래픽을 사용하게 설정하였습니다.



4) IP대역에 따라 속도를 제한하고 싶다면?
==============================================
<CBandClass class_1>
    CBandClassDst 192.168.0.0/24
</CBandClass>
<CBandClass class_2>
    CBandClassDst 222.97.189.0/24
</CBandClass>

<VirtualHost *>
   ServerName intranet.gnux.co.kr    
   Document /home/gnux/intranet
   CBandClassRemoteSpeed class_1 50Mbps 10 30
   CBandClassRemoteSpeed class_2 300kbps 10 30
</VirtualHost>
==============================================
위 설정은, 내부아이피 192.168.0.XXX 에서,
50Mbps의 대역폭과, 초당 10번의 요청, 동시접속자 30을 설정하며,
다른 ip대역 222.97.189.XXX에서는
300kpbs, 초당 10번의 요청, 동시접속자 30을 설정합니다.


5. 사용량 확인.
   http://도메인/cband-status
   http://도메인/cband-status-me
status

 ** xml 형태로 데이터를 얻고 싶다면?
   http://도메인/cband-status?xml
   http://도메인/cband-status-me?xml
xml



6. 지시자 및 단위 설명 (필요시 찾아보세요!!)
  1) 단위.
    * 전송속도 단위
          o kbps, Mbps, Gbps - bits per second: 1024, 1024*1024 , 1024*1024*1024 bps
          o kb/s, Mb/s, Gb/s - bytes per second:  1024, 1024*1024, 1024*1024*1024 b/s
          o 기본 : kbps

    * 트래픽 쿼터 단위
          o K, M, G - bytes: 1000, 1000*1000 ,1000*1000*1000 bytes
          o Ki, Mi, Gi - bytes: 1024, 1024*1024, 1024*1024*1024 bytes
          o 기본 : K

    * 시간(기간) 단위
          o S, M, H, D, W - 초, 분, 시간, 일, 주
          o 기본 : S

  2) 지시자들
     (1) 이름 : CBandDefaultExceededURL
          설명 : 제한을 초과했을때 보여줄 URL  (지정하지 않으면, 503 에러 페이지)
            문맥 : Server config
          문법 : CBandDefaultExceededURL URL

     (2)이름 : CBandDefaultExceededCode
         설명 : 제한을 초과했을시 보여줄 에러 코드
         문맥 : Server config
         문법 : CBandDefaultExceededCode HTTP_CODE
         예제 : CBandDefaultExceededCode 509  


     (3)이름 : CBandScoreFlushPeriod
         설명 : scoreboard 파일에 기록할 요청수, mod_cband 의 성능에 영향을 준다.
         기본값 : 1
         문맥 : Server config
         문법 : CBandScoreFlushPeriod 요청수
         예제 : CBandScoreFlushPeriod 100  ( 매 100번의 요청에 한번씩 scoreboard 파일에 기록)

     (4)이름 : CBandSpeed
         설명 : 가상호스트 도메인의 최대 속도, 요청수, 접속수  설정
         문맥 : <Virtualhost>
         문법 : CBandSpeed kbps rps max_conn
                kbps - 초당 최대 전송속도
                rps - 초당 최대 요청수
                max_conn - 최대 동시 접속수
         예제 : CBandSpeed 1024 10 30
                 최대 1024kbps전송속도로 제한, 초당 10개의 요청 처리, 동시 접속을 30개로 제한.

     (5)이름 : CBandRemoteSpeed
         설명 : 접속자(IP)의 최대속도, 요청수, 접속수 제한 (CBandSpeed와 비슷하지만, 접속자당 설정)
         문맥 : <Virtualhost>
         문법 : CBandRemoteSpeed kbps rps max_conn
                  kbps - 초당 최대 전송속도
                  rps - 초당최대 요청수
                  max_conn - 최대 동시 접속수
         예제 : CBandRemoteSpeed 20kb/s 3 3
                  접속자(ip)에대해 최대 20kb/s , 초당 3개의 요청, 동시 접속 3개로 제한.

     (6)이름 : CBandClassRemoteSpeed
         설명 : 정의한 class(ip 범위)에 대해 최대속도, 요청수, 접속수 제한
         문맥 : <Virtualhost>
         문법 : CBandClassRemoteSpeed class_name kbps rps
                  class_name - 이미 정의한 클래스 이름 (IP범위)
                  kbps - 초당 최대 전송속도
                  rps - 초당 최대 요청수
                  max_conn - 최대 동시 접속수
         예제 : <CBandClass googlebot_class>
                    CBandClassDst 66.249.64/24
                    CBandClassDst 66.249.65/24
                    CBandClassDst 66.249.79/24
                  </CBandClass>
                        CBandClassRemoteSpeed googlebot_class 20kb/s 2 3
                        위에서 정의한 클래스(googlebot_class)의 요청에는 20kb/s 의 전송속도,
                       초당 3개의 요청, 동시 접속 3개로 제한.

     (7)이름 : CBandRandomPulse
         설명 : 속도 제한을 위해서 임의의 파형을 생성한 다음 처리하는 mod_cband의 처리 방법이다.
                   부하가 많을때는 자동 Off된다.
         문맥 : Global
         문법 : CBandRandomPulse On/Off

     (8)이름 : CBandLimit
         설명 : 제한할 전송량을 설정한다. (기간은 CBandPeriod 에서 설정)
         문맥 : <Virtualhost>
         문법 : CBandLimit limit
                  limit - 전송량, 사용단위: K (kilo), M (mega), G (giga), Ki (kibi), Mi (mebi), Gi (gibi)
         예제 : CBandLimit 10M
                    전송양을 10M(10*1000*1000bytes)로 제한한다.
                  CBandLimit 10Mi
                    전송양을 10M(10*1024*1024bytes)로 제한한다.

     (9)이름 : CBandClassLimit
         설명 : 정의한 class(ip범위)에 대해 제한할 전송량 설정.
         문맥 : <Virtualhost>
         문법 : CBandClassLimit class_name limit
                  class_name - 이미 정의한 클래스 이름(ip범위)
                  limit - 전송량, 사용단위: K (kilo), M (mega), G (giga), Ki (kibi), Mi (mebi), Gi (gibi)

   (10)이름 : CBandExceededURL
         설명 : 제한을 초과했을시 보여줄 URL, 지정하지 않으면 503 에러 발생 ( 가상호스트에서 )
         문맥 : <Virtualhost>
         문법 : CBandExceededURL URL

   (11)이름 : CBandExceededSpeed
         설명 : 전송양을 초과했을시 , 전송속도 제한 설정.
         문맥 : <Virtualhost>
         문법 : CBandExceededSpeed kbps rps max_conn
                  kbps - 초당 최대 전송속도
                  rps - 초당 최대 요청수
                  max_conn - 최대 동시 접속수

    (12)이름 : CBandScoreboard
         설명 : 가상호스트의 scoreboard 파일 지정. (성능향상을 위해 필요)
         문맥 : <Virtualhost>
         문법 : CBandScoreboard path
                  (path는 아파치(nobody또는 apache)권한으로 쓰기가능해야 함)

    (13)이름 : CBandPeriod
         설명 : 용량제한기간(이 기간이 지나면, 측정되었던 용량은 지워진다.)
         문맥 : <Virtualhost>
         문법 : CBandPeriod period
                  period - 사용단위: S (초), M (분), H (시간), D (일), W (주)
         예제 : CBandPeriod 1W  (1주일)
                  CBandPeriod 14D  (14일)
                  CBandPeriod 60M  (60분)

   (14)이름 : CBandPeriodSlice
         설명 : 기간이 길때는 나눌 기간을 명시한다.
         기본값 : slice_len = limit
         문맥 : <Virtualhost>
         문법 : CBandPeriodSlice slice_length
         예제 : CBandLimit 100G
                  CBandPeriod 4W
                  CBandPeriodSlice 1W
                   4주는 1주일 단위로 나뉜다(4W/1W = 4). 용량은 100G/4=25G
                   1주에 25G, 2주째 50G 이렇게 나눠 처리 된다.

   (15)이름 : <CBandUser>
         설명 : 새로운 cband 가상 사용자 설정
         문맥 : Server config
         문법 : <CBandUser user_name>

   (16)이름 : CBandUserSpeed
         설명 : cband 가상 사용자의 속도, 요청수, 동시 접속수 제한
         문맥 : <CBandUser>
         문법 : CBandUserSpeed kbps rps max_conn
                  kbps - 초당 최대 전송속도
                  rps - 초당 최대 요청수
                  max_conn - 최대 동시 접속수
         예제 : CBandUserSpeed 100kb/s 10 5


   (17)이름 : CBandUserLimit
         설명 : cband 가상 사용자의 저송 용량 제한.
         문맥 : <CBandUser>
         문법 : CBandUserLimit limit
                  limit - 사용용량, 사용단위: K (kilo), M (mega), G (giga), Ki (kibi), Mi (mebi), Gi (gibi)
         예제 : CBandUserLimit 10M
                  CBandUserLimit 10Mi

   (18)이름 : CBandUserClassLimit
         설명 : cband 가상 사용자의 정의한 class(ip범위)에 대해 제한할 전송량 설정
         문맥 : <CBandUser>
         문법 : CBandUserClassLimit class_name limit
                  class_name - 지정한 class(IP범위)이름
                  limit -사용용량, 사용단위: K (kilo), M (mega), G (giga), Ki (kibi), Mi (mebi), Gi (gibi)

   (19)이름 : CBandUserExceededURL
         설명 : cband 가상 사용자의, 제한을 초과했을시 보여줄 URL,
                   지정하지 않으면 503 에러 발생 ( 가상호스트에서 )
         문맥 : <CBandUser>
         문법 : CBandUserExceededURL URL

   (20)이름 : CBandUserExceededSpeed
         설명 : cband 가상 사용자의, 전송양을 초과했을시 , 전송속도 제한 설정.
         문맥 : <CBandUser>
         문법 : CBandUserExceededSpeed kbps rps max_conn
                  kbps - 초당 최대 전송속도
                  rps - 초당 최대 요청수
                  max_conn - 최대 동시 접속수

  (21)이름 : CBandUserScoreboard
         설명 : cband 가상 사용자의, scoreboard 파일 지정.
         문맥 : <CBandUser>
         문법 : CBandUserScoreboard path
                  (path는 아파치(nobody또는 apache)권한으로 쓰기가능해야 함)

  (22) 이름 : CBandUserPeriod
         설명 : cband 가상 사용자의, 용량제한기간(이 기간이 지나면, 측정되었던 용량은 지워진다.)
         문맥 : <CBandUser>
         문법 : CBandUserPeriod period
                  period - 사용단위: S (초), M (분), H (시간), D (일), W (주)
         예제 : CBandUserPeriod 1W
                  CBandUserPeriod 14D
                  CBandUserPeriod 60M

  (23)이름 : CBandUserPeriodSlice
         설명 : cband 가상 사용자의, 기간을 나눌 기간 명시
         기본값 : slice_len = limit
         문맥 : <CBandUser>
         문법 : CBandUserPeriodSlice slice_length
         예제 : CBandUserLimit 100G
                  CBandUserPeriod 4W
                  CBandUserPeriodSlice 1W
                   4주는 1주일 단위로 나뉜다(4W/1W = 4). 용량은 100G/4=25G
                   1주에 25G, 2주째 50G 이렇게 나눠 처리 된다.


7. 마치며..
 이것으로 현재 최신버전의 mod_cband 설치 및 운영, 상세 지시자 설명 하는 강좌를 마치겠습니다.
처음 이 모듈을 발견했을때 너무 너무 기뻣고, 바로 적용해 테스트 하였습니다.
특히 xml로 데이터를 추출할 수 있어 가공함에 있어 아주 아주 편리했습니다.
국내에는 아직 mod_cband에 과한 강좌가 없어 많은 사람들에게
도움을 주기 위해서 이렇게 강좌를 작성합니다.
  본 강좌에 대해서 오타 및 문제가 있다면, doly골뱅이superuser.co.kr으로 메일
한통 바랍니다.

2006년 6월 ... 모기들이 태어나는 계절에... 도리...



## 참고문서
http://cband.linux.pl
http://www.howtoforge.com/mod_cband_apache2_bandwidth_quota_throttling

-- 출처 : 리눅스포털(원문 : http://www.superuser.co.kr/home/lecture/index.php?leccode=10588)


참고 자료
Posted by iWithJoy