Apache HTTP Server Version 2.0

Apache > HTTP Server > Documentation > Version 2.0 > 모듈

# 아파치 모듈 mod_ext_filter

가능한 언어: en | ko

설명: | 응답 내용을 외부 프로그램으로 처리한 후 클라이언트로 보낸다
상태: | Extension
모듈명: | ext_filter_module
소스파일: | mod_ext_filter.c

### 요약

`mod_ext_filter`를 사용하면 간단하고 익숙한 방법으로 필터를 만들 수 있다. 표준입력에서 읽고 표준출력에 쓰는 프로그램(즉, 유닉스식 필터 명령어)을 아파치 필터로 사용할 수 있다. 이런 필터는 아파치 API로 쓰여지고 아파치 서버 프로세스 안에서 실행되는 필터에 비해 매우 느리지만, 다음과 같은 장점이 있다:

- 프로그래밍 모델이 매우 간단하다
- 프로그램이 표준입력에서 읽고 표준출력에 쓸 수만 있다면 어떤 프로그래밍/스크립트 언어라도 사용할 수 있다
- 이미 있는 프로그램을 수정없이 아파치 필터로 사용할 수 있다

실제 사용하기에는 성능이 떨어지지만, `mod_ext_filter`를 사용하여 필터를 빨리 만들어볼 수 있다.

### 지시어들

### 주제

- 예제

### 참고

- 필터

## 예제

### 다른 type의 응답을 HTML로 만든다

`# mod_ext_filter 지시어를 가지고
# 외부 프로그램 /usr/bin/enscript를 사용하여
# 문서파일과 text/c 파일을 HTML로 만들고 결과의
# type을 text/html로 변경하는 필터를 정의한다
ExtFilterDefine c-to-html mode=output \
intype=text/c outtype=text/html \
cmd="/usr/bin/enscript --color -W html -Ec -o - -"
<Directory "/export/home/trawick/apacheinst/htdocs/c">
# 출력에 새로운 필터를 실행하는 core 지시어
SetOutputFilter c-to-html
# .c 파일의 type을 text/c로 만드는 mod_mime
# 지시어
AddType text/c .c
# 디버그 수준을 높여서 요청마다 현재 설정을
# 알려주는 로그문을 기록하는 mod_ext_filter
# 지시어
ExtFilterOptions DebugLevel=1
</Directory>`

### content 인코딩 필터 구현하기

Note: 아래 gzip 예제는 단지 설명을 예로 든 것이다. 실제 서비스에 사용하려면 `mod_deflate`를 참고하길 바란다.

`# 외부 필터를 정의하는 mod_ext_filter 지시어
ExtFilterDefine gzip mode=output cmd=/bin/gzip
<Location /gzipped>
# 출력할때 gzip 필터를 실행하는 core 지시어
SetOutputFilter gzip
# "Content-Encoding: gzip" 헤더를 추가하는
# mod_header 지시어
Header set Content-Encoding gzip
</Location>`

### 서버를 느리게 하기

`# cat으로 모든 내용을 통과하는 필터를 정의하는
# mod_ext_filter 지시어; cat은 아무것도 수정하지
# 않는다; 단지 처리경로를 길게 하여 자원을 더 소모한다
ExtFilterDefine slowdown mode=output cmd=/bin/cat \
preservescontentlength
<Location />
# 출력할때 slowdown 필터를 여러번 실행하는 core 지시어
#
SetOutputFilter slowdown;slowdown;slowdown
</Location>`

### sed를 사용하여 응답에서 글을 대체하기

`# 응답에서 글을 대체하는 필터를 정의하는
# mod_ext_filter 지시어
#
ExtFilterDefine fixtext mode=output intype=text/html \
cmd="/bin/sed s/verdana/arial/g"
<Location />
# 출력할때 fixtext 필터를 실행하는 core 지시어
SetOutputFilter fixtext
</Location>`

### 다른 필터를 추적하기

`# 압축 문제가 있는 특정 클라이언트(IP 192.168.1.31)에
# 대해 mod_deflate가 읽고 쓰는 자료를 추적한다.
# 이 필터는 mod_deflate로 보내기 전 자료를 추적한다.
ExtFilterDefine tracebefore \
cmd="/bin/tracefilter.pl /tmp/tracebefore" \
EnableEnv=trace_this_client
# 이 필터는 mod_deflate에서 나오는 자료를 추적한다.
# ftype 파라미터를 사용하지않는 경우, 기본 필터형
# AP_FTYPE_RESOURCE는 필터 순서를 mod_deflate *이전에*
# 둔다. AP_FTYPE_CONTENT_SET 보다 조금 높은 숫자값을
# 지정하면 mod_deflate 이후에 실행한다.
ExtFilterDefine traceafter \
cmd="/bin/tracefilter.pl /tmp/traceafter" \
EnableEnv=trace_this_client ftype=21
<Directory /usr/local/docs>
SetEnvIf Remote_Addr 192.168.1.31 trace_this_client
SetOutputFilter tracebefore;deflate;traceafter
</Directory>`

### 다음은 자료를 추적하는 필터이다:

`#!/usr/local/bin/perl -w
use strict;
open(SAVE, ">$ARGV[0]")
or die "can't open $ARGV[0]: $?";
while (<STDIN>) {
print SAVE $_;
print $_;
}
close(SAVE);`

## ExtFilterDefine 지시어

설명: | 외부 필터를 정의한다
문법: | `ExtFilterDefine filtername parameters`
사용장소: | 주서버설정
상태: | Extension
모듈: | mod_ext_filter

`ExtFilterDefine` 지시어는 외부 필터의 성질과 실행할 프로그램, 아규먼트를 정의한다.

filtername은 정의할 필터 이름을 지정한다. 이 이름을 SetOutputFilter 지시어에서 사용한다. 등록한 모든 필터들간에 이름이 겹치면 안된다. 현재 필터등록 API는 오류를 보고하지 않는다. 그래서 사용자는 이름이 겹치는 문제를 알지 못한다.

실행할 외부 명령어와 다른 성질을 정의하는 나머지 아규먼트는 어떤 순서로 나와도 가능하다. 단, `cmd=` 파라미터는 반드시 필요하다. 사용할 수 있는 파라미터는 다음과 같다:

`cmd=cmdline`
  `cmd=` 키워드는 실행할 외부 명령어를 지정한다. 프로그램명 뒤에 아규먼트가 있다면 명령행을 쌍따옴표로 묶어야 한다 (예를 들어, `cmd="/bin/mypgm arg1 arg2"`). 쉘을 거치지않고 직접 프로그램을 실행하기때문에 일반적인 쉘 따옴표는 필요없다. 프로그램 아규먼트들은 공백으로 구분한다. 프로그램 아규먼트에 공백이 있다면 공백 앞에 백슬래쉬로 사용해야 한다. 백슬래쉬가 아규먼트의 일부라면 백슬래쉬를 두번 사용해야 한다. 프로그램을 실행할때 표준 CGI 환경변수와 추가로 DOCUMENT_URI, DOCUMENT_PATH_INFO, QUERY_STRING_UNESCAPED 변수를 설정한다.
`mode=mode`
  `mode`는 현재 (기본값인) `output`만 가능하다. 미래에는 `mode=input`을 사용하여 요청 내용을 처리하는 필터를 지정할 수 있을 것이다.
`intype=imt`
  이 파라미터는 필터로 처리할 문서의 인터넷 media type(즉, MIME type)을 지정한다. 기본적으로 모든 문서를 필터로 처리한다. `intype=`을 지정하면 다른 type의 문서는 필터로 처리하지 않는다.
`outtype=imt`
  이 파라미터는 필터로 처리한 문서의 인터넷 media type(즉, MIME type)을 지정한다. 필터처리 작업중에 인터넷 media type을 변경할때 유용하다. 기본적으로, 인터넷 media type은 변하지 않는다.
`PreservesContentLength`
  `PreservesContentLength` 키워드는 필터가 content length를 유지하도록 한다. 대부분의 필터가 content length를 변경하므로 이 키워드는 기본값이 아니다. 필터가 길이를 유지할때만 이 키워드를 사용해야 한다.
`ftype=filtertype`
  이 파라미터는 필터 종류에 대한 숫자값을 지정한다. 대부분의 경우 기본값인 AP_FTYPE_RESOURCE가 적당하다. 필터를 실행하는 순서가 자원필터와 달라야하는 경우 이 파라미터가 필요하다. 적당한 값을 알려면 util_filter.h에 있는 AP_FTYPE_* 정의를 참고하라.
`disableenv=env`
  이 파라미터로 설정한 환경변수가 정의되었다면 필터를 사용하지 않는다.
`enableenv=env`
  이 파라미터로 설정한 환경변수가 정의된 경우 필터를 사용한다.

## ExtFilterOptions 지시어

설명: | `mod_ext_filter` 옵션을 설정한다
문법: | `ExtFilterOptions option [option] ...`
기본값: | `ExtFilterOptions DebugLevel=0 NoLogStderr`
사용장소: | directory
상태: | Extension
모듈: | mod_ext_filter

`ExtFilterOptions` 지시어는 `mod_ext_filter`의 특별한 처리옵션을 지정한다. Option은 다음중 하나다.

`DebugLevel=n`
  `DebugLevel` 키워드는 `mod_ext_filter`가 기록하는 디버그 문구 수준을 정한다. 기본값은 디버그문을 기록하지 않는다. 이는 `DebugLevel=0`과 같다. 높은 숫자를 사용할수록, 더 많은 디버그문이 기록되고 서버 성능이 떨어진다. 숫자값의 실제 의미는 `mod_ext_filter.c` 앞부분에 있는 DBGLVL_ 상수 정의에 설명되있다.

  주의: 필터 로그를 기록하려면 core 지시어 `LogLevel`을 사용하여 디버그문을 아파치 오류로그에 기록해야 한다.

`LogStderr | NoLogStderr`
  `LogStderr` 키워드는 외부 필터 프로그램이 표준오류로 출력하는 문구를 아파치 오류로그에 기록한다. `NoLogStderr`는 이 기능을 하지 않는다.

### 예제

`ExtFilterOptions LogStderr DebugLevel=0`

위의 설정을 사용하면 필터가 표준오류로 출력하는 문구를 아파치 오류로그에 기록하고, `mod_ext_filter`는 자체 디버그문을 기록하지 않는다.

가능한 언어: en | ko