[웹서버] BandWidth 로 아파치 전송속도 제한하기(아랑)

———————————————————————-

      BandWidth 로 아파치 전송속도 제한하기

                            작성자 : 서진우 (alang@sysmng.com)

———————————————————————-

웹호스팅을 하다 보면..한 서버에 여러개의 사이트를 운영하게 되는데..

같은 서버의 한 몇몇 사이트에서 과도한 트래픽을 유발함으로 해서 다른

사이트의 서비스에 지장을 주는 경우가 종종 있다. 이때 아파치에서 지원

하는 bandwidth 모듈을 사용하여 특정사이트의 전송속도를 제한할수 있다.

아파치에 bandwidth 모듈을 설치하는 방법으론 크게 두가지가 있다.

아파치를 컴파일 할때 DSO 방식으로 컴파일 하여 mod_bandwidth.so를

아파치 설정에서 읽어 드려서 적용하는 방식과 ..아파치를 컴파일할때

mod_bandwidth.c 를 같이 컴파일 하여 아파치 기본 모듈에 탑재하는 방법

이 있다. 먼저 DSO 방식으로 적용하는 법에 대해 간단히 알아 보자..

먼저 아파치를 DSO 방식으로 컴파일 한다.

# ./configure –prefix=/usr/local/apache –enable-shared=max

# make && make install

그런뒤..

ftp://ftp.cohprog.com/pub/apache/module/1.3.0/mod_bandwidth.c

을 받는다. Redhat 6.0 이상을 설치할때 아파치 개발환경에 관련된 팻킷을

설치하면 기본으로 /usr/lib/apache/mod_bandwidth.so 가 있지만 그렇지

않을 경우엔 직접 컴파일해서 모듈을 만들어야 한다.

o 직접 컴파일 하려면 다음의 명령을 따라하시면 됩니다. 물론 그러기

위해서는 아파치의 개발용 헤더들이 시스템에 설치되어 있어야 합니다.

레드햇의 경우 apache-devel이라는 패키지로 존재합니다. 그 위치는

/usr/include/apache/에 있습니다. (배포판에 따라 틀릴 수 있습니다.)

$ gcc -c -I/usr/include/apache -O2 -m486 -fno-strength-reduce \\

mod_bandwidth.c -fpic -DSHARED_MODULE mod_bandwidth.c

$ gcc -shared -o mod_bandwidth.so mod_bandwidth.o

$는 쉘 프롬프트를 나타내며 \\는 줄이 이어진다는 뜻입니다. 그러니까 한

줄로 붙여 쓰시기 바랍니다.

컴파일된 모듈을 아파치 모듈이 위치하는 디렉토리로 옮기시기 바랍니다.

/usr/local/apache/libexec 에 생성된 mod_bandwidth.so 을 넣으면 된다.

그런뒤 아파치 설정인 httpd.conf 파일에 DSO Support 지원 부분에 각 아

파치 모듈을 불러오는 부분이 있다. 여기에 다음 한줄을 추가해 준다.

LoadModule bandwidth_module libexec/mod_bandwidth.so

그리고 바로 밑에 보면..ClearModuleList 가 있다. 여기제일 밑에 ..

AddModule mod_bandwidth.c

을 추가 해주면 된다.

다음으로는 아파치와 같이 컴파일하여 모듈을 아파치 내부에 탑재하는

방법이다.

먼저 mod_bandwidth.c 를 apache-1.3.x/src/modules/extra 밑에 복사해

둔다. 그런뒤 다음 옵션으로 mod_bandwidth.c 를 같이 컴파일 한다.

# ./configure –prefix=/usr/local/apache \\

–add-module=src/modules/extra/mod_bandwidth.c \\

–enable-module=so

# make && make install

그런뒤 /usr/local/apache/bin/httpd -l 를 이용하여 mod_bandwidth.c

모듈이 올라와서 있는지 확인 하면 된다.

그런뒤 이 모듈이 사용하기 위해서는 데이타를 기록할 장소가 필요하는데

기본적으로 /tmp/apachebw 디렉토를 사용한다. 설정에 앞서 먼저 환경을

만들도록 한다.

# mkdir -p /tmp/apachebw/link

# mkdir -p /tmp/apachebw/master

# chmod 777 /tmp/apachebw

# chmod 777 /tmp/apachebw/link

# chmod 777 /tmp/apachebw/master

이제 httpd.conf 에서 설정을 살펴 보도록 하자.

virtualhost 설정 들어가지 전에 ..

BandWidthModule On 한줄을 추가 하고 각 디렉토리 별로 설정을 해 주

면 된다.

<Directory /home/usr01/posglobal>

LargeFileLimit 10 5120

LargeFileLimit 300 2560

MinBandWidth all -1

BandWidth all 2560

BandWidth angeleyesmovie.co.kr 2560

</Directory>

위와 같이 설정이 되어졌다고 하면…

/home/usr01/posglobal 이란 디렉토리의 전송 속도 제한으로

10KB ~ 300KB 사이의 크기의 파일을 보내줄때 5120byte/sec

속도로 보낼수 있고 300KB 이상의 파일은 2560byte/sec 속도

로 제한이 되는 것이다.

이제 실제적인 전송 속도 제한의 옵션을 알아 보겠습니다.

BandWidth, LargeFileLimit, MinBandWidth 이렇게 세가지의 지시자?가

있습니다. 각각에 대해서 알아 봅시다.

          o BandWidth

  문  법: BandWidth <도메인|IP주소|all> <속도>

  기본값: 없음

  사용처: 전체 설정, 디렉토리별 설정, .htaccess

  호스트에 따라 속도의 제한을 걸 수 있습니다. all은 모든 호스트에

  대해서 제한을 거는 것입니다. 도메인이나 IP주소로 접속 호스트를

  지정할 수 있습니다. 그리고 네트워크/마스크 포맷*으로 지정할 수도

  있습니다. (예: 192.168.0.0/24)

  속도는 Bytes/second로 나타냅니다. 0의 경우는 제한이 없는 것입니다.

  디렉토리별 설정에서 사용한 예를 들겠습니다.

    BandWidth 192.168.1 0

    BandWidth foobar.net 0

    BandWidth all 1024

  /home/httpd/html 디렉토리에서의 제한을 한 것입니다. 192.168.1.* IP

  주소를 가진 호스트와 *.foobar.net이라는 도메인명을 사용하는

  호스트에 대해서는 제한을 걸지 않으며 그 외 모든 접속에 대해서

  1024Bytes/sec으로 제한을 걸었습니다.

          o LargeFileLimit

  

  문  법: LargeFileLimit <파일크기> <속도>

  기본값: 없음

  사용처: 전체 설정, 디렉토리별 설정, .htaccess

  

  일정 이상의 크기를 가진 파일을 누군가가 받아 가려 할 때 그 속도의

  제한을 걸 수 있습니다. 파일크기는 KByte 기준이며 속도는 역시

  Bytes/secound입니다.

  

  LargeFileLimit 1024 4096

  LargeFileLimit 2048 2048

  

  위 예제는 1024 ~ 2047KB 크기의 파일을 받아가려 할 때 속도를

  4KB/sec으로 제한하고 2048KB 이상의 파일은 2KB/sec으로 제한을 하는

  것입니다.

          o MinBandWidth

  

  문  법: MinBandWidth <도메인|IP주소|all> <속도>

  기본값: all, 256

  사용처: 전체 설정, 디렉토리별 설정, .htaccess

  

  데이타 전송의 최저 속도를 지정하게 됩니다. 예를 들어서 설명하는

  것이 가장 좋을 것 같군요.

  

  BandWidth를 4096 (4KBytes/sec)으로 지정하고 MinBandWidth가 1024로

  지정이 되어 있을 때:

    – 지정된 호스트에서 하나만 접속할 경우, 4096bytes/sec이 최고의

      속도가 됩니다.

    – 지정된 호스트에서 두개가 동시에 접속할 경우, 각각의 세션에 대해

      2048Bytes/sec이 최고의 속도가 됩니다.

    – 더 많은 동시 접속이 일어나도 세션 당 최고 속도는 1024Bytes/sec

      이하로는 줄지 않습니다. (MinBandWidth 값이 1024기 때문에)

  MinBandWidth가 “-1″로 지정되면 모든 세션에 대해 최고 속도는

  BandWidth나 LageFileLimit에서 지정한 속도가 나올 수 있게 됩니다.

  BandWidth를 4096으로 지정하고 MinBandWidth가 -1이라면 동시에 지정된

  호스트에서 몇개의 접속을 하더라도 각 세션의 속도는 4096Bytes/sec

  까지 나오게 되는 것입니다.

참고 사항…

이는 서비스 해오면서..그냥..경험으로 감잡은 설정값이다.

1. 서버 전체적으로 과도 징조가 보이기 시작할때…

<Directory /home>

Bandwidth all 10240

LargeFileLimit 10 10240

LargeFileLimit 512 5120

MinBandWidth all -1

</Directory>

2. 트래픽 과도의 징조를 보이는 사이트..

<Directory /path/home_dir>

LargeFileLimit 10 5120

LargeFileLimit 512 2560

MinBandWidth all -1

BandWidth all 2560

BandWidth domain_name 2560

</Directory>

3. 한 트래픽 하는 녀석들…

<Directory /path/home_dir>

LargeFileLimit 10 1024

LargeFileLimit 300 512

MinBandWidth all -1

BandWidth all 512

BandWidth domain_name 512

</Directory>

4. 나갔으면 하는 사이트들…

<Directory /path/home_dir>

LargeFileLimit 10 512

LargeFileLimit 300 256

MinBandWidth all -1

BandWidth all 256

BandWidth domain_name 256

</Directory>

  

5. 무조건 내 보내야 하는데 개기는 녀석들…

<Directory /path/home_dir>

LargeFileLimit 10 128

LargeFileLimit 200 64

MinBandWidth all -1

BandWidth all 64

BandWidth domain_name 64

</Directory>

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

2 Responses

  1. 2022년 6월 20일

    3enclosure

  2. 2023년 1월 26일

    3profits

페이스북/트위트/구글 계정으로 댓글 가능합니다.