0. 내가 원한는 것?
예전 apache 1은 mod_throttle으로 가상호스트별 트래픽 측정 및 제한이 가능했습니다.
이 트래픽 제한 기능은 호스팅을 하기위해서는 필수입니다.
어떤 도메인에서 많이 사용하는지 아는 것은 아주 중요한 일이기 때문입니다.
하지만, apache2를 쓰면 이놈을 포기할 수 밖에 없었습니다.
검색하다 .. mod_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/src
wget http://cband.linux.pl/download/mod-cband-0.9.7.5.tgz  (다운이 않됨 ㅜ.ㅜ 하여 파일 첨부 함)
tar xvfpz mod-cband-0.9.7.5.tgz
cd mod-cband-0.9.7.5
./configure –with-apxs=/usr/local/apache/bin/apxs
## 옵션설명
## –with-apxs=/usr/local/apache/bin/apxs : 아파치 apxs경로를 지정합니다.
make
make install
 
2. 설치확인
- vi /usr/local/apache/conf/httpd.conf 문서를 열면
 LoadModule cband_module modules/mod_cband.so 줄이 추가된 것을 볼 수 있습니다.
 
- /usr/local/apache/modules 디렉토리에
 mod_cband.so 파일이 추가 된 것을 볼수 있습니다.
 
3. 기본 설정
아래의 내용을 추가해 준다.
====================================
<Location /cband-status>
  SetHandler cband-status
  Order deny,allow
  Deny from all
  Allow from 열어줄아이피( 또는 all)
< /Location>
 
<Location /cband-status-me>
  SetHandler cband-status-me
< /Location>
 
<VirtualHost *>
  ServerName xxxx.co.kr
  Document /var/www/xxxx
  CBandLimit 300Mi
  CBandPeriod 1D
  CBandExceededURL http://manager.xxxx.co.kr/traffic_exceeded.html 
< /VirtualHost>
======================================
위 설정파일은 xxxx.co.kr 도메인에 하루에 300M(300*1024*1024byte)의 트래픽을 제공하는 설정입니다.
bit로 따지면, 2.4Gbit/일 트래픽을 제공하는 것입니다. 만약 하루에 300M를 초과했다면,
“http://manager.xxxx.co.kr/traffic_exceeded.html” 페이지가 뜨며,
지정하지 않았다면, 503 에러 페이지가 뜨게됩니다.
만약!. 제한을 하지 않고 관찰만 하려 한다면, CBandPeriod 부분만 남기고 삭제합니다.
 
4. 상황별 설정
1) 자료실 속도 제한
==============================
<VirtualHost *>
  ServerName file.xxxx.co.kr
  Document /home/xxxx/file
  CBandSpeed 1024 10 30
  CBandRemoteSpeed 20kb/s 3 30
< /VirtualHost>
==============================
위 설정은 file.gnux.co.kr 도메인에 대해서 속도를 1024kbps 로 제한하며,
초당 10번의 연결, 동시접속자를 30으로 제한하는 예제입니다.
 
2) 사용자 일트래픽 제공 및 초과시 연결수 제한.
==============================
<VirtualHost *>
  ServerName doly.xxxx.co.kr
  Document /home/xxxx/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.xxxx.co.kr
  Document /home/xxxx/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. 사용량 확인.
status
 
** 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 이렇게 나눠 처리 된다.