Server/WebServer

apache httpd module

Jacob_baek 2012. 4. 3. 10:59

apache 에서 추가적인 기능 사용을 위해 모듈을 추가할 수 있다. 실제로 모듈을 새롭게 받아야 하는 경우도 있고 기존 disable 되어 있는 모듈을 enable 하여 사용할 수도 있다.


module 사용방법

리눅스의 경우는 configuration 당시 모듈을 지정하여 같이 컴파일 할 수 있다.

우분투의 경우 a2enmod 명령을 통해 모듈에 대한 enable / disable을 수행할 수 있다.

(/etc/apache2/sites-available/default 설정파일 및 a2enmod 명령어 참고할것)

윈도우는 module 이라는 폴더내에 기본 모듈이 존재하며 만약 존재하지 않는 경우 다운로드 받아 해당 폴더에 복사하고 httpd.conf 파일내에 Loadmodule 옵션을 추가하면 된다.


module 종류 및 설명

httpd -M 옵션을 통한 명령 수행시 현재 설정된 모듈이 출력된다.


mod_cache

URI를 키로 하여 내용을 캐쉬를 수행한다.

<httpd.conf 설정 예제>

CacheRoot /home/cache    ### 캐쉬되는 디렉토리 지정

CacheEnable disk /    ### "/" 와 같은 URL-STRING 이하의 URL들을 캐쉬한다. 저장관리자는 disk/mem/fd가 존재한다.

CacheDirLevels 1

CacheDirLength 2

CacheMaxFileSize 20000000    ### 기본으로 1M가 최대임으로 더많은 용량을 캐쉬하기 위해서 변경필요

CacheMinFileSize 1000    ### 

★그외지시자

CacheIgnoreCacheControl On    ### On/Off 할수 있으며 HTTP Cache-Control 헤더를 무시하고 캐쉬한다.

CacheIgnoreHeaders    ### 특정 헤더에 대한 캐쉬기능을 사용하지 않을 경우 사용한다.

CacheIgnoreNoLastMod On    ### On/Off 할수 있으며 last-modified 헤더정보를 무시하고 캐쉬한다.



mod_disk_cache

mod_mem_cache


★참고사이트

http://helicontech.blogspot.com/2009/01/how-modcache-works.html

다음과 같은 조건에서 캐쉬한다.

- Request Method 가 GET일 경우

- 응답 상태가 200(200, 203,300,301 또는 410)

- 요청에 Authorization 헤더가 포함된 경우 응답을 캐쉬하지 않는다.

- 응답에 Authorization 헤더가 포함된 경우, cache-control 헤더에 s-maxage,must-revalidate 또는 public 가 포함되어 있어야 한다.

- Expires 응답 해더에 미래 날짜가 포함된 경우

- 응답에 expiration time을 포함한 경우

- cache-control 헤더에 private 가 포함된 경우 cache 되지 않는다.(cachestoreprivate 를 통해 무시할수 있다.)

- cache-control 헤더에 Etag, Last-Modified 혹은 Expires 가 미포함된 경우 cache되지 않는다.(cacheignorenolastmodified 를 통해 무시할수 있다.)

- 동적 컨텐츠의 경우 캐쉬되지 않는다.


캐쉬가 정상적으로 동작하는지 확인하기 위해 wget을 통한 캐쉬 여부를 확인해 보기로 했다.

실제로 proxy가 동시에 동작하는 환경이기 때문에 클라이언트에서 다음과 같은 테스트 명령을 수행해서 확인하였다.

- wget -e http_proxy=http://192.168.1.1:9000 http://172.29.150.150/test.txt


mod_proxy

아파치 웹서버를 Proxy 서버로 사용할수 있다.

<httpd.conf 설정 예제>

LoadModule proxy_module modules/mod_proxy.so

# LoadModule proxy_connect_modue modules/mod_proxy_connect.so


ProxyRequests On


<Proxy *>

Order deny, allow    ### 명령 순위 deny -> allow (즉, 차단 먼저)

Deny from all    ### 프록시 서버 접근 제한(모든 접근 차단)

Allow from internal.example.com    ###  internal.example.com 만 허용

</Proxy>

★ 포워드 프록시

client -> proxy(내부) -> Target Server

위 구성에서도 볼수 있듯이 일반적인 프록시 구성으로 내부에 프록시 서버를 통해 Target Server에 접속하는 방법이다. 실제 Target Server를 알수 있으며 proxy에 대한 정보로 설정 및 인지를 해야한다.


★ 리버스 프록시

client -> proxy(외부) -> Target Server

위 구성에서도 볼수 있듯이 포워드 프록시와의 차이점은 proxy 서버가 외부에 있는지 내부에 있는지이다. 위와 같은 상황에서는 우리는 Target Server의 실제 주소는 알수 없다. 쉽게 이해하기 위해서는 말 그대로 포워드 프록시와 반대로 흐림이 발생한다고 생각하면 된다.

좀더 쉽게 이야기하자면 리버스가 의미하는 바는 "반대"가 아닌 "뒷편"이라고 할수 있고 실서버를 감추어 보안성을 높일수 있기 때문이다.

이것을 활용하면 proxy를 또 다른 proxy 서버로 포워딩하는 것이 가능하다. 또한 부하분산 및 리버스 프록시의 중재로 인한 보안향상의 효과를 볼수 있다.


ProxyPass /proxy http://XXXX/    ### 

ProxyPassReverse /proxy http://XXXX/    ###


★ 그외지시자

ProxyRemote * http://192.168.1.1/    ### 

ProxyRemoteMatch  [regtex] [remote server]  ### 정규표현식을 사용할수 있으며 proxyremote와 동일한 기능을 사용할 수 있다.(ex. proxyremotematch test.com http://192.168.1.1:8080)

ProxyVia On    ### [On/Off/Full/Block] 프록시를 경유하는 HTTP 헤더정보를 제어할수 있는 기능

ProxyTimeout 

ProxyPass

NoProxy

 프록시 구성시 참고 사이트

http://www.mnot.net/cache_docs/



Proxy 요청은 다음과 같은 명령이 수행된다고 생각할 수 있다.

- GET http://origin_dst_domain/index.html HTTP/1.0

- 즉, proxyserver에 접속하여 origin_dst_domain으로 데이터를 요청하게 되는것이다.



※ Proxy 와 Cache




mod_rewrite

해당 모듈은 클라이언트의 URL 요청에 대한 redirection 수행을 한다.

<httpd.conf 설정 예제>

RewriteEngine On  ## 해당 모듈의 엔진을 사용할지 여부를 설정(Off시에 해당 모듈 기능을 사용하지 않는다.)

RewriteLog [File-Path] ##

RewriteLogLevel

RewriteCond [String] [Pattern]  ## RewriteCond 규칙과 부합하는지 검사하고 부합할 경우만 RewriteRule 조건매칭을 수행한다.

RewriteRule [Pattern] [C/L/R]

※ 정규표현식에 대하여 기본 지식이 필요하다.

- RewriteRule

정규식을 사용하여 redirection 수행을 위한 규칙을 생성할 수 있다.


mod_expires

<httpd.conf 설정 예제>





mod_ssl

<ssl.conf 설정 예제>



mod_jk

Tomcat과 apache 연동을 위한 모듈

<httpd.conf 설정 예제>



mod_throttle

트래픽 관리 모듈로 비슷한 모듈은 mod_cband / mod_bandwidth가 있다.

mod_throttle은 apache 1.3.X 대만 지원하고 있고 현재는 2.X 대는 지원하지 못하고 있다.

아파치재단에서 공식적으로 지원하는 모듈은 아니다.



mod_headers

해당 모듈은 HTTP 요청과 응답에 대한 헤더필드를 control 할수 있다.

<httpd.conf 설정 예제>

RequestHeader    ### 요청패킷의 헤더정보를 Control할때 사용한다.

RequestHeader set 

RequestHeader unset 

RequestHeader append 

RequestHeader add


Header    ### 응답패킷의 헤더정보를 Control할때 사용한다.

Header set 

Header unset 

Header append

Header add


예를 들어 Range 헤더필드를 제거하고 싶은 경우 

RequestHeader unset Range 와 같이 설정한후 패킷덤프를 해보면 해당 패킷내의 Range 헤더필드는 존재하지 않는 것처럼 보여진다.



mod_cband

virtual host 별로 트래픽 제한을 수행할 수 있다.

설치과정

tar xvf mod-cband-0.9.7.5

./configure --with-apxs=/usr/bin/apxs2

make 

make install






mod_evasive

DDOS 공격 방어 모듈



mod_bw


설치과정

tar xfz mod_bw-0.92.tgz

apxs -i -v -p mod_


proxy 환경에서는 지원이되지 않는다.(즉, proxy 되어 경유되는 파일은 다운로드시 rate limit가 이루어지지 않는다.)


Apache Extension Program

apxs 는 새모듈을 추가할수 있다.


/usr/local/apache/bin/apxs -c mod_speling.so 

(gcc 호출해서 mod_speling을 컴파일 한다.)



참고사항

- http://httpd.apache.org


※ 영문자료 오역이나 개인의 잘못된 생각이 가미되었을수도 있기에 수정이 필요한 부분이 존재할 수 있습니다. 수정이 필요하거나 삭제 및 추가가 필요한 경우 댓글 남겨주시면 수정토록 하겠습니다.