서버로는 FreeBSD 만(동영상 스트리밍 제외)을 고집하고 있습니다. 이런 서버들은 특히 웹서버로 많이 이용되는데 대부분의 웹 서버들은 apache 1.3 을 사용하고 있습니다.
저는 처음부터 apache 2.0 을 접한지라 1.3 에 대한 생소함 등등 때문에 사용해보지 않았습니다. 그러나 apache 1.3 에서 사용되는 것 중 부러운 것으로 mod_throttle 가 있었습니다. 가상 호스트 별로 트레픽 제한을 걸 수 있는 녀석입니다. +_+;
최근 Oper.or.kr 서버에서 여차저차 아는 사람을 위주로 웹호스팅 처럼 계정을 주게 되었는데 제가 일일이 모니터링 할 수도 없고 로그만 보면서 트레픽 쓰는 서버를 찾는다는 것이 쉬운 것이 아닌 듯하여 특히나 더 간절했던 것 같습니다.
그리하여 예전에 한번쯤 봤던 기억이 나서 검색엔진에서 찾아보니 mod_cband 라는 것이 있었습니다. 설명에 의하면 mod_cband 는 apache 2.x 에서만 사용이 가능하고, apache 1 에서의 mod_throttle 와 mod_bandwidth 와 비슷한 역할을 한다고 합니다. 사실 둘다 사용해보지 않아 저는 자세한 기능을 모르지만 사용해보신 여러분은 잘 아실 듯하니 믿고 넘어갑니다. (mod_throttle 는 트레픽 제한, mod_bandwidth 는 속도 제한의 역할을 한답니다.)
FreeBSD 에 설치할 것이므로 우선 포트에 있는지 확인해 봤습니다.
<@HyperCube> ====> FreeBSD 포트 mod_cband-0.9.7.3 (www) <====
<@HyperCube> 분류: www / 메인테이너: apache@FreeBSD.org
<@HyperCube> 등록: Wed Sep 7 19:53:52 2005
<@HyperCube> 설명: A per-virtualhost bandwidth limiter module for Apache 2
<@HyperCube> 검색된 포트가 없습니다. : mod_throttle
<@HyperCube> ====> FreeBSD 포트 mod_bandwidth-2.0.6 (www) <====
<@HyperCube> 분류: www / 메인테이너: apache@FreeBSD.org
<@HyperCube> 등록: Thu Jul 3 15:13:45 2003
<@HyperCube> 설명: Bandwidth management module for the Apache webserver
자 여기서 크게 상관은 없지만 apache 1 에서 사용되는 mod_throttle 은 FreeBSD ports 에 없다는 것을 보실 수 있는데 이건 아래의 사유로 포트 트리에서 삭제 되었기 때문이라고 합니다.
Per insistence of the author of this software, remove these ports from the Ports Collection. (제작자의 요청으로 인해, 이 포트를 포트 트리에서 삭제합니다.)
우선 mod_cband 를 설치하도록 합니다.
# cd /usr/ports/www/mod_cband
# make install clean
자 설치를 마쳤습니다. 의외로 간단하죠? 이제 httpd.conf 세팅을 해야됩니다. 저는 apache 2.0 을 사용하고 있으므로 /usr/local/etc/apache2/httpd.conf 에 위치하지만 apache22 등을 사용하실 경우에는 /usr/local/etc/apache22/httpd.conf 등을 참고하셔야 됩니다.
# cd /usr/local/etc/apache2
# vi httpd.conf
우선 여기서 추가해줘야 될 것으로는 아래 세가지가 있습니다.
- CBand 가 적용된 모든 가상호스트들이 얼마나 트레픽을 사용하였는지 모니터링할 수 있는 관리자 페이지로, 아래에서는 /cband-status 로 연결했습니다.
- 현재 자신이 얼마만큼의 트레픽을 사용했는지 알 수 있는 확인 페이지로, 아래에서는 /cband-status-me 로 연결했습니다.
- VirtualHost 설정
우선 추가해야될 1. 항목입니다.
<Location /cband-status>
SetHandler cband-status
Order deny,allow
Deny from all
Allow from Oper.oPer.opEr.opeR.or.kr
</Location>
이건 2. 항목이고요.
<Location /cband-status-me>
SetHandler cband-status-me
</Location>
물론, 위의 두 항목에 대한 경로는 설정하시기 나름이고요. 이곳에 추가한다면 모두가 같은 설정을 적용받게 되니 <VirtualHost> 구문 안에 넣어서 사용하셔도 무방합니다. (예: <Location /traffic-me> 등)
여기서 /cband-status 의 경우에는 Deny from all 로 기본적으로 모든 사용자의 접속을 차단해두고 Allow from 에서 지정한 IP 에서만의 접속을 허용하도록 되어있습니다. 하지만 우리 나라의 인터넷은 대부분 유동 IP 이고 계속 인터넷 접속이 되어있는 것도 아니니 IP 로 입력하는 것은 적절하지 않다고 봅니다. 그래서 저 같은 경우는 특정 VirtualHost 으로 접속할 때만 되도록 만들었습니다. (전 초보니 이부분은 다른 분들의 도움을 받아주세요.)
이제 <VirtualHost> 구문을 아래와 비슷한 방식으로 설정합니다.
<VirtualHost *:80>
ServerName oper.or.kr
DocumentRoot /usr/local/www/data
CBandLimit 300Mi
CBandPeriod 1D
CBandExceededURL http://oper.or.kr/cband/traffic_over.html
</VirtualHost>
oper.or.kr 도메인에 대해 1일에 300Mbyte 의 트레픽을 허용하며 그 트레픽을 초과하면 http://oper.or.kr/cband/traffic_over.html 을 출력합니다.
대부분 웹호스팅을 하거나 할 경우 한 사용자가 여러개의 도메인을 사용하는 경우가 많고, 그에 따라 여러개의 <VirtualHost> 를 가지게 되는 경우가 빈번합니다. 그럴 땐 어떻게 하느냐?
<CBandUser user>
CBandUserLimit 300Mi
CBandUserPeriod 1D
</CBandUser>
<VirtualHost *:80>
ServerName oper.or.kr
DocumentRoot /usr/local/www/data
CBandUser user
</VirtualHost>
<VirtualHost *:80>
ServerName ik.oper.or.kr
DocumentRoot /usr/local/www/data
CBandUser user
</VirtualHost>
일종의 클래스 개념입니다. user 라는 클래서는 1일에 300Mbyte 의 전송량을 할당받고, oper.or.kr 과 ik.oper.or.kr 도메인이 user 클래스의 영향을 받는다는 구문입니다. CBandExceededURL 를 지정하지 않았기 때문에 트레픽을 초과하면 503 에러를 출력합니다.
이 외에도 VirtualHost 별로 대역폭 설정 및 접속 IP 별로 대역폭 설정 등을 할 수 있지만, 그 부분은 다루지 않겠습니다. (왜냐? 역시 초보라..)
설정을 다 하셨으면 apache 를 재시작해 주시고요. 이제 http://Domain/cband-status 와 http://Domain/cband-status-me 로 접속해 확인합니다. 물론 위에서 설정한 Domain 으로 접속해야겠죠?
위 정보는
이곳에서 얻어왔습니다. 아래의 설정 값 역시
이곳에서.. ^^; (귀찮음?) 보다 자세한 것은 이곳을 한번 살펴보시고 해결이 안되신다면 코멘트로 질문 달아주시면 아는 것을 답변해 드리겠습니다.
1) 단위
* 전송속도 단위
o kbps, Mbps, Gbps - bits per second:1024, 1024*1024 , 1024*1024*1024 bps
o kb/s, Mb/s, Gb/s - bytes persecond: 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 에러 페이지)
문맥 : Serverconfig
문법 :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 kbpsrps max_conn
kbps - 초당 최대 전송속도
rps - 초당 최대 요청수
max_conn - 최대 동시 접속수
예제 : CBandSpeed 102410 30
최대 1024kbps전송속도로 제한, 초당 10개의 요청 처리, 동시 접속을 30개로 제한.
(5) 이름 : CBandRemoteSpeed
설명 : 접속자(IP)의 최대속도,요청수, 접속수 제한 (CBandSpeed와 비슷하지만, 접속자당 설정)
문맥 :<Virtualhost>
문법 : CBandRemoteSpeedkbps rps max_conn
kbps - 초당 최대 전송속도
rps - 초당최대 요청수
max_conn - 최대 동시 접속수
예제 : CBandRemoteSpeed20kb/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 - 최대 동시 접속수
예제 : <CBandClassgooglebot_class>
CBandClassDst 66.249.64/24
CBandClassDst 66.249.65/24
CBandClassDst 66.249.79/24
</CBandClass>
CBandClassRemoteSpeedgooglebot_class 20kb/s 2 3
위에서 정의한클래스(googlebot_class)의 요청에는 20kb/s 의 전송속도, 초당 3개의 요청, 동시 접속 3개로 제한.
(7) 이름 : CBandRandomPulse
설명 : 속도 제한을 위해서 임의의파형을 생성한 다음 처리하는 mod_cband의 처리 방법이다.
부하가 많을때는 자동 Off된다.
문맥 : Global
문법 : CBandRandomPulseOn/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>
문법 : CBandClassLimitclass_name limit
class_name - 이미 정의한 클래스 이름(ip범위)
limit - 전송량, 사용단위: K (kilo), M (mega), G (giga), Ki (kibi), Mi (mebi),Gi (gibi)
(10) 이름 : CBandExceededURL
설명 : 제한을 초과했을시 보여줄URL, 지정하지 않으면 503 에러 발생 (가상호스트에서)
문맥 :<Virtualhost>
문법 : CBandExceededURLURL
(11) 이름 : CBandExceededSpeed
설명 : 전송양을 초과했을시 , 전송속도제한 설정.
문맥 :<Virtualhost>
문법 :CBandExceededSpeed kbps rps max_conn
kbps - 초당 최대 전송속도
rps - 초당 최대 요청수
max_conn - 최대 동시 접속수
(12) 이름 : CBandScoreboard
설명 : 가상호스트의 scoreboard파일 지정. (성능향상을 위해 필요)
문맥 :<Virtualhost>
문법 : CBandScoreboardpath
(path는 아파치(www)권한으로 쓰기가능해야 함)
(13) 이름 : CBandPeriod
설명 : 용량제한기간(이 기간이 지나면,측정되었던 용량은 지워진다.)
문맥 :<Virtualhost>
문법 : CBandPeriod period
period - 사용단위: S (초), M (분), H (시간), D (일), W (주)
예제 : CBandPeriod1W (1주일)
CBandPeriod 14D (14일)
CBandPeriod 60M (60분)
(14) 이름 : CBandPeriodSlice
설명 : 기간이 길때는 나눌 기간을명시한다.
기본값 : slice_len = limit
문맥 :<Virtualhost>
문법 : CBandPeriodSliceslice_length
예제 : CBandLimit 100G
CBandPeriod 4W
CBandPeriodSlice 1W
4주는 1주일 단위로 나뉜다(4W/1W = 4). 용량은 100G/4=25G
1주에 25G, 2주째 50G 이렇게 나눠 처리 된다.
(15) 이름 : <CBandUser>
설명 : 새로운 cband 가상 사용자설정
문맥 : Server config
문법 : <CBandUseruser_name>
(16) 이름 : CBandUserSpeed
설명 : cband 가상 사용자의 속도,요청수, 동시 접속수 제한
문맥 : <CBandUser>
문법 : CBandUserSpeedkbps rps max_conn
kbps - 초당 최대 전송속도
rps - 초당 최대 요청수
max_conn - 최대 동시 접속수
예제 : CBandUserSpeed100kb/s 10 5
(17) 이름 : CBandUserLimit
설명 : cband 가상 사용자의 저송용량 제한.
문맥 : <CBandUser>
문법 : CBandUserLimitlimit
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는 아파치(www)권한으로 쓰기가능해야 함)
(22) 이름 : CBandUserPeriod
설명 : cband 가상 사용자의,용량제한기간(이 기간이 지나면, 측정되었던 용량은 지워진다.)
문맥 : <CBandUser>
문법 : CBandUserPeriodperiod
period - 사용단위: S (초), M (분), H (시간), D (일), W (주)
예제 : CBandUserPeriod 1W
CBandUserPeriod 14D
CBandUserPeriod 60M
(23) 이름 : CBandUserPeriodSlice
설명 : cband 가상 사용자의,기간을 나눌 기간 명시
기본값 : slice_len = limit
문맥 : <CBandUser>
문법 :CBandUserPeriodSlice slice_length
예제 : CBandUserLimit100G
CBandUserPeriod 4W
CBandUserPeriodSlice 1W
4주는 1주일 단위로 나뉜다(4W/1W = 4). 용량은 100G/4=25G
1주에 25G, 2주째 50G 이렇게 나눠 처리 된다.
## 참고문서
http://cband.linux.plhttp://www.howtoforge.com/mod_cband_apache2_bandwidth_quota_throttling
http://www.superuser.co.kr/home/lecture/index.php?leccode=10588