[웹서버] 각 도메인별(virtual host)로 트래픽 제한하는 법

사이트 : http://www.snert.com/Software/mod_throttle/index.shtml

작동예: http://test1.tt.co.kr/throttle-status

번역))

이 아피치 모듈은 가상 호스트별로, 디렉토리별로, 위치(Locations)별로,

또는 유저에 따라 서버의 로드를 낮추거나 대역폭을 낮추기 위해 개발되었다.

이를 통해 언제 접속을 지연시킬 것인가, 또는 요청을 거부할 것인가를 결정할 수 있다.

또한 mod_throttle 는 들어오는 요청에 대해 클라이언트 ip 별로 또는 인증된 유저

별로 추적하고 제어할 수 있다.

모든 요청은 이제 4가지 throttling 레벨의 데이터를 기준으로 제한할 수 있다.

이는

(1) 클라이언트의 IP 주소(ThrottleClientIP),

(2) 인증된 원격유저(ThrottleRemoteUser),

(3) 로컬의 유저ID(ThrottleUser),

(4) 그리고 디렉토리나 위치(Location), 가상 호스트 또는 서버

(ThrottlePolicy)별이다.

아래 목록은 각각의 정책에 대한 세부적인 설명이다.

모든 정책은 limit(제한)과 기간(period time) 이라는 두개의 파라미터를 필요로 한다.

None

이 정책은 접속 요청에 대해 어떠한 제한도 없이 통과시킨다.

period 는 카운터가 리셋되기 전까지 얼마나 오랫동안 데이터가 축적될 것인가를 정의한다.

Concurrent

동시에 접근 가능한 현재의 접속자수에 대한 제한을 뜻한다.

period 는 카운터가 리셋되기 전까지 얼마나 오랫동안 데이터가 축적될 것인가를 정의한다.

이 정책은 ThrottleClientIP 나 ThrottleRemoteUser와 함께 사용될 수 없다.

Document

일정시간(per period)동안 동시 요청 회수(히트수)를 제한시 카운터에서 제외할

HTML 구성 요소인 이미지나 스타일 시트등을 의미한다. 이 limit 가 초과

되었을 때에는 지정한 시간이 될 때까지 접속이 거부당하고 기간이 지난후 reset

된다.

(즉 하루를 단위로 설정시 오후 4시에 limit 에 달해 접속이 차단되었다면 밤 12시

까지 접속이 거부되다가 카운터가 리셋되는 0시부터 다시 접속이 되는 것이다.)

throttle status 페이지에 있는 requests(hits) 에는 페이지 구성요소에 대한 정보는

포함하지 않는다는 것을 주의하기 바란다.

idle

요청 사이의 최소한의 idle time(쉬는 시간)을 의미한다.

최소값에 도달하지 않았을 경우 요청은 계산된 속도 지연이 생기거나 접속

이 차단된다.

(즉 접속간 허용 시간이 5초로 설정되었는데, 3초만에 새로운 접속이 들어온다면

접속을 차단한다.)

일단, 지정된 시간(period) 을 초과시 카운터는 reset 된다.

둘째로 요청 사이의 idle 시간이 최소값을 초과할 경우 요청은 지연없이 계속된다.

(즉 5초로 설정되었는데, 8초만에 새로운 접속이 들어온다면 접속을 차단할 이유가

없다.)

그렇지 않으면 요청은 일초나 ThrottleMaxDelay 초 사이에 지연된다.

만약 지연이 ThrottleMaxDelay 을 초과시(즉 5초보다 더 자주 요청을 한다면)

요청을 거부한다.

Original

이는 일정 기간중 데이터 전송량(받아간 kbytes)을 제한하는 것을 의미하

며 이 값을 초과시 속도지연이 생기거나 접속이 차단된다.

첫번째로 지나간 시간이 period 기간을 초과시 전송량과 지난 시간은 이등 분된다.

두번째로 만약 전송량이 제한이하일 경우 0 으로 설정되지 않았다면 지연 카운터는

1초대로 떨어진다. 그렇지 않으면 제한이 초과시 지연 카운터는 1초마다 증가된다.

지연은 0초와 ThrottleMaxDelay 에서 지정한 초사이이다.

Random

랜덤하게 요청의 퍼센테지 제한을 받는다. 만약 퍼센트가 0일 경우 모든 요청은

제한된다. 만약 퍼센트가 100일 경우 모든 요청은 허용된다.

period 은 카운터가 리셋되기 전까지 얼마나 오랫동안 데이터가 축적될 것인가를

정의한다.

Request

특정한 기간(period)동안의 접속 요청수를 제한할 수 있다.

이 제한값에 다다를 경우 카운터가 리셋되기 전까지 모든 요청은 거부된다.

speed

특정 기간동안의 전송량에 대한 제한을 뜻하며 이 제한을 초과시 접속지연

이나 중단이 된다.

첫번째로 지나간 시간이 period 길이를 초과시 허용된 제한은 지정된 전송

량에서 빼지며 이 값은 마이너스가 될 수 없다. 또한 period 길이는 지나간 시간

에서 빼어진다.

두번째로 전송량이 limit 이하라면 요청은 지연없이 진행된다.

그렇지 않다면 요청은 1이나 ThrottleMaxDelay 초 사이에 지연된다.

만약 지연이 ThrottleMaxDelay 를 초과한다면 모든 요청을 거부한다.

Volume

지정된 시간동안의 전송량 제한을 뜻한다.

이 제한이 초과시 카운터가 리셋되기 전까지 모든 요청은 거부된다.

설치하기

1. mod_throttle312.tgz 파일을 다운로드하여 압축을 해제한다.

2. 여러분의 운영체제에 따라 mod_throttle.c 소스 파일의 상단에 있는

#undef 와 #define 을 찾아 사용할 semaphore & shared memory API 를 편

집하여야 한다.

semaphore 를 지원하기 위해서는 아래중 하나를 #define하여야 하며

나머지는 #undef 하여야 한다. 만약 아래것중 하나를 #define 하지 않는다

면 mod_throttle 는 세마포어가 지원되지 않을 것이며 이는 정의되지 않은 결과를

갖게 될 것이다.

USE_POSIX_SERIALIZATION

USE_FCNTL_SERIALIZATION

USE_FLOCK_SERIALIZATION

USE_SYSTEM_V_SERIALIZATION

공유 메모리가 지원되기 위해서는 아래중 오직 하나를 #define 하여야 하며

나머지는 #undef 하여야 한다.이것중 하나를 #define 하지 않는다면

mod_throttle 는 공유메모리 없이 작동될 것이며 이는 정의되지 않은 결과

를 갖게 될 것이다.

USE_POSIX_SHARED_MEMORY

USE_SYSTEM_V_SHARED_MEMORY

3. DSO 모듈을 빌드하기 위해서는 아래와 같이 한다.

cd (path to)/mod_throttle-3.1

make install

스태틱하게 모듈을 빌드하려면

cd /usr/local/apache_1.3.14 (아파치 소스의 경로)

./configure \\ (추가정보에 대해서는 아래를 참고)

–disable-shared=throttle \\

–add-module=(path to)/mod_throttle-3.1/mod_throttle.c \\

… (your other configuration options) …

make install

4. HTTPD.CONF 파일을 편집하여 아래와 같이 추가한다.

ThrottlePolicy none

SetHandler throttle-status

SetHandler throttle-me

SetHandler throttle-me

5. 아파치 웹서버를 재시작한다.

6. 상태 페이지는 http://www.mydomain.com/throttle-status 에서 확인한다.

설정하기

아래의 명령어는 일반적인 아피치 파일인 httpd.conf 에 추가될 수 있다.

SetHandler throttle-client-ip

Context: server, , ,

최근에 접속한 클라이이언트의 IP 주소를 보여준다.

모든 클라이언트를 리셋할 수 있는 링크가 있으며 개별적인 클라이언트도

리셋할 수 있다.

각각의 열은 클라이언트의 IP, limit에 도달한 수치를 퍼센트로, 이 클라이언트에

의한 총 요청수와 이 클라이언트에 의해 접속이 거부된 수, 기간중 전송량, 요청당

평균 전송량, 현재의 접속지연, 지나간 시간 그리고 마지막 요청후 idle 시간을

보여준다.

SetHandler throttle-remote-user

Context: server, , ,

최근에 인증된 원격 유저의 목록을 보여준다. 모든 또는 개별적인 유저를

리셋할 수 있는 링크가 있다.

각각의 열은 인증된 원격유저이름, limit 에 도달한 퍼센트지, 이 원격 유저에 의한

총 요청수, 이 원격 유저에게 거부된 요청수, 기간중 전송량, 요청당 평균 전송량,

현재 접속지연, 지나간 시간, 마지막 접속 이후 idle 시간등이다.

SetHandler throttle-status

Context: server, , ,

서버및 가상호스트, 디렉토리 그리고 throttle에 걸린 로컬유저를 보여준다.

모든 또는 개별적인 유저를 리셋할 수 있는 링크가 있으며 작동데이터를 보존할 수

있다.

각각의 열은 throttled 되는 목록, limit에 다다른 퍼센트지, 접속요청수, 거부된

요청수, 기간당 전송량, 요청당 평균 전송량, 현재의 접속지연, 정책, 제한, 기간,

지나간 시간, 그리고 마지막 요청후 idle 시간을 보여 준다.

http://my.domain.com/throttle-status

SetHandler throttle-me

Context: server, , ,

SetHandler throttle-status 와 비슷하게 오직 한유저에 대해서만

정보를 보여준다. 이 handler의 의미는 시스템 관리자가

클라이언트에게 다른 유저들의 정보는 보이 않고 자신의 것만 볼 수 있도록

허용할 때 주로 이용된다.

handler이 위와 같이 설정되었다고 가정하면 ~user 에 대한 URL 은 아래

와 같을 것이다.

http://my.domain.com/~user/throttle-me

만약 http://my.domain.com/throttle-me 로 접속하면

http://my.domain.com/ 에 대한 모든 정보를 제공한다.

ThrottleClientIP size policy limit period

Context: server

클라이언트의 IP 주소 목록의 사이즈를 정의하며 클라이언트 IP 주소 정보

에 기반하여 모든 들어오는 요청에 대해 적용된다.

Concurrent 는 무시된다.

size 가 0보다 클 경우 클라이언트 IP 주소에 대한 throttling 는 작동하게 된다.

클라이언트 ip 주소로부터의 요청은 짧은 시간에 추적되어지며 지정된 정책에 따른다.

추적되는 클라이언트 IP 주소의 기간은 최근부터 오래된 순서로 나멸되며 클라이언트 IP 주소 목록의 사이즈에 의존한다.

새로운 클라이언트 ip 주소가 연결될 때마다 가장 오래된 목록이 사라지

고 새로운 클라이언트 ip 가 재설정된다.

ThrottleContentType string

Context: server

throttle 상태에서 보여질 기본적인 Content-Type 을 정의한다.

text/html, text/plain 이렇게 두개의 타입만 지원된다.

text/html은 컬러로 형성되는 포맷이며 헤더와 footer가 없이 text/plain

으로 구분된다.

아무것도 지정되지 않을때 기본적인 형식은 text/html 이다.

이는 아래와 같이 재지정될 수 있다.

http://my.domain.com/throttle-status?content-type=text/plain

ThrottleIndicator green percentage

ThrottleIndicator yellow percentage

ThrottleIndicator red percentage

Context: server

throttle-status 에서 비주얼하게 보여줄 각각의 시발점을 정의한다.

기본으로는 녹색으로 50이며, 노랑색 75, 90을 넘으면 빨강색이다.

ThrottleLockFile string

Context: server

fcntl() 나 flock() 시 locak 파일이 사용된다.

로컬의 디스크에 저장되어야 한다.

ThrottleMaxDelay seconds

Context: server

이 설정은 지연을 사용하는 모든 정책에 영향을 준다.

이는 정책에 의해 적용되는 상위의 제한을 의미한다.

기본적으로는 60초이며 0은 제한을 하지 않는 것을 의미한다.

ThrottlePolicy policy limit period

Context: server, , ,

policy 는 위에서 설명한 것중 하나이다.

limit 는 K(kilo byte), M(Mega-Byte), 또는 G(Giga-byte) 이다.

아무것도 설정되지 않을 경우에는 기본적으로 kilo-byte 이다.

period 는 s(second), m(minute), d(day), w(weeks) 이다.

아무것도 설정되지 않을 경우에는 기본적으로 초(second)이다.

ThrottleRefresh seconds

Context: server

throttel-status 가 보이는 refresh 시간을 정의한다.

정의가 되지 않을 경우 기본적으로는 60초이다.

이는 아래와 같이 설정시 재설정을 하게 된다.

http://www.domain.com/throttle-status?refresh=20

ThrottleRemoteUser size policy limit period

Context: server

인증된 유저의 목록의 사이즈를 지정한다. 글러벌하게 설정시

모든 요청에 대해 적용된다. Concurrent 정책은 무시된다.

목록의 사이즈가 0보다 클 경우 인증된 유저에 대한 throttling 는

활성화 된다.(기본값은 0이다.) 웹서버가 자원에 대해 접근을 제한한다면

원격 유저에 대한 인증이 필요하다.

################ 적용시 이렇게…..

(1) 위의 설명과 같이 아파치 컴파일시

./configure –prefix=/www –activate-

module=src/modules/php4/libphp4.a

–disable-shared=throttle –add-module=../mod_throttle-

3.1.2/mod_throttle.c

와 같이 할 때 작동하지 않았다.

따라서 컴파일시 –disable-shared=throttle 을 빼고

./configure –prefix=/www –activate-

module=src/modules/php4/libphp4.a

–add-module=../mod_throttle-3.1.2/mod_throttle.c

와 같이 컴파일하기 바란다.

mod_throttle.c 는

http://www.snert.com/Software/mod_throttle/index.shtml 에서

다운로드 가능하며 또는 tt.co.kr:/root/mod_throttle.c 를 참고해도 된

다.

아파치 컴파일후 생성된 httpd -l 을 실행하여

mod_throttle.c 이 모듈에 포함되었는지 확인한다.

(2) httpd.conf 에 아래와 같이 설정한다.

(Location /throttle-status)

Order deny,allow

Deny from all

Allow from 211.47.64.0/255.255.255.0

Allow from 211.63.158.17

(/Location)

이는 throttlee-status 에 대해 내부에서만 접근이 가능하도록 제한한다.

(IfModule mod_throttle.c)

ThrottlePolicy None // 기본적으로 None 으로 설정한다.

(Location /throttle-status)

SetHandler throttle-status // throttle-status 만 필요하다.

(/Location)

(/IfModule)

## 가상 호스트 설정 부분 예)

(VirtualHost test1.tt.co.kr)

ServerAdmin webmaster at tt.co.kr

DocumentRoot /www/htdocs

ServerName test1.tt.co.kr

ThrottlePolicy Volume 300M 1d //하루에 전송량 300M

ThrottlePolicy Request 1000 1d //하루에 히트수 1000회 제한

ThrottleClientIP 100 volume 200 300 // 로그를 100K 남기며 300초간

200K 의 전송량 제한

(/VirtualHost)

ErrorDocument 503 /~system/ 로 redirect 하여 트래픽 초과시

/~system/index.html 파일을 보여주도록 한다.

그리고

(IfModule mod_throttle.c)

ThrottlePolicy Volume 300M 1d

(Location /throttle-status)

SetHandler throttle-status

(/Location)

(/IfModule)

로 설정하고 가상 호스트에서 특정 도메인에 대해

(VirtualHost test2.tt.co.kr)

ServerAdmin webmaster at tt.co.kr

DocumentRoot /www/htdocs

ServerName test2.tt.co.kr

ThrottlePolicy Volume 500M 1d //하루에 전송량 500M

(/VirtualHost)

와 같이 설정시 모든 도메인은 1일 300메가로 제한되지만

test2.tt.co.kr 은 500메가로 제한된다.

이에 대한 작동예는 http://test1.tt.co.kr/throttle-status 에서 확인가

능하다.

서진우

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

You may also like...

2 Responses

  1. 2022년 6월 19일

    3accountable

  2. 2023년 1월 26일

    3undeserving

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