Apache HTTP Server Version 2.0
아파치 모듈 mod_deflate
설명: | 내용을 클라이언트로 보내기 전에 압축한다 |
---|---|
상태: | Extension |
모듈명: | deflate_module |
소스파일: | mod_deflate.c |
요약
mod_deflate
모듈은 서버의 출력을 네트웍으로
클라이언트에 보내기 전에 압축하는 DEFLATE
출력필터를
제공한다.
참고
권장하는 설정
급한 사람을 위한 견본 설정이다.
일부 type만 압축
AddOutputFilterByType DEFLATE text/html text/plain text/xml
아래 설정은 요약하였지만 그래도 복잡하다. 설정을 완전히 이해한 후 사용하라.
이미지를 제외한 모든 것을 압축
<Location />
# 필터를 추가한다
SetOutputFilter DEFLATE
# Netscape 4.x에 문제가 있다...
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08에 더 문제가 있다
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE은 Netscape라고 자신을 알리지만, 문제가 없다
# BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# 주의: 아파치 2.0.48까지 mod_setenvif의 버그때문에
# 위의 정규표현식은 동작하지 않는다. 원하는 효과를
# 얻기위해 다음과 같이 수정하여 사용한다:
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
# 이미지를 압축하지 않는다
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png)$ no-gzip dont-vary
# 프록시가 잘못된 내용을 전달하지않도록 한다
Header append Vary User-Agent env=!dont-vary
</Location>
압축하기
출력 압축
DEFLATE
필터가
압축을 한다. 다음 지시어는 지시어가 있는 위치의 문서를
압축한다:
SetOutputFilter DEFLATE
모든 내용을 압축하면 처리하지 못하는 브라우저가 있기때문에
html 파일만을 압축하기위해 (아래 참고)
gzip-only-text/html
을 1
로 설정할지도
모른다. 이를 1
이 아닌 값으로 설정하면
무시한다.
보통 특별한 MIME type만 압축하려면 AddOutputFilterByType
지시어를 사용한다.
다음 설정은 html 파일만을 압축한다:
<Directory "/your-server-root/manual">
AddOutputFilterByType DEFLATE text/html
</Directory>
압축한 파일을 처리하지 못하는 브라우저에게는 압축하지않고
보내길위해 BrowserMatch
지시어에 no-gzip
을
설정한다. 최적의 결과를 얻기위해 no-gzip
과
gzip-only-text/html
을 같이 사용할 수 있다.
이 경우 전자가 후자를 무시한다. 위 절의 설정 예제 일부를 살펴보자:
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
먼저 User-Agent
문자열을 보고 Netscape
Navigator 버전 4.x인지 검사한다. 이 버전은 text/html
이
아닌 type의 압축을 처리하지 못한다. 버전 4.06, 4.07, 4.08은
html 파일 압축을 처리하는대도 문제가 있다. 그래서 우리는
이 경우 deflate 필터를 완전히 사용하지않는다.
세번째 BrowserMatch
지시어는 Microsoft Internet Explorer가 자신을 "Mozilla/4"로
알리지만 압축된 요청을 처리할 수 있기때문에 user agent
추측을 수정한다. User-Agent
헤더에서 "MSIE"
(\b
는 "단어 경계"를 뜻한다) 문자열을 발견하면
앞에서 설정한 제약을 푼다.
주의
DEFLATE
필터는 항상 PHP나 SSI와 같은 RESOURCE
필터 뒤에 들어간다. 또, 내부 하위요청(subrequest)에 영향을
주지 않는다.
입력 압축풀기
mod_deflate
모듈은 gzip으로 압축된 요청
내용을 푸는 필터도 제공한다. 이 기능을 사용하려면 다음과
같이 SetInputFilter
나
AddInputFilter
를
사용하여 입력필터순서에 DEFLATE
필터를
추가한다.
<Location /dav-area>
SetInputFilter DEFLATE
</Location>
요청에 Content-Encoding: gzip
헤더가 있다면
자동으로 압축된 내용을 푼다. gzip 요청을 할 수 있는
브라우저는 드물다. 그러나 어떤 WebDAV 클라이언트와 같은
특별한 프로그램은 요청 압축을 지원한다.
Content-Length에 대한 주의
요청 내용을 직접 살펴본다면, Content-Length
헤더를 믿지마라! Content-Length 헤더는 클라이언트가
보낸 내용의 길이이지, 압축을 푼 결과의 바이트수가
아니다.
프록시 서버 다루기
mod_deflate
모듈은 프록시가 자신이 캐쉬한
응답을 적절한 Accept-Encoding
요청 헤더를 보낸
클라이언트에게만 보내도록 Vary:
Accept-Encoding
HTTP 응답 헤더를 추가한다. 그래서
압축된 내용을 이해할 수 없는 클라이언트에 압축된 내용을
보내지않도록 한다.
예를 들어, User-Agent
헤더 등에 따라 특별히
필터 적용을 취소한다면, 프록시에게 이러한 제한을 알려주기위해
직접 Vary
헤더에 추가해야 한다. 예를 들어,
설정이 User-Agent
에 따라 DEFLATE
필터를 추가한다면 다음을 사용한다:
Header append Vary User-Agent
요청 헤더외의 다른 정보에 (예를 들어, HTTP 버전)
따라 압축 여부가 결정된다면, Vary
헤더값을
*
로 설정해야 한다. 그러면 표준을 따르는 프록시는
캐쉬를 하지 않게 된다.
예제
Header set Vary *
DeflateBufferSize 지시어
설명: | zlib이 한번에 압축할 크기 |
---|---|
문법: | DeflateBufferSize value |
기본값: | DeflateBufferSize 8096 |
사용장소: | 주서버설정, 가상호스트 |
상태: | Extension |
모듈: | mod_deflate |
DeflateBufferSize
지시어는 zlib이
한번에 압축할 바이트수를 지정한다.
DeflateCompressionLevel 지시어
설명: | 출력을 어느정도 압축하는가 |
---|---|
문법: | DeflateCompressionLevel value |
기본값: | Zlib's default |
사용장소: | 주서버설정, 가상호스트 |
상태: | Extension |
모듈: | mod_deflate |
지원: | 아파치 2.0.45 부터 |
DeflateCompressionLevel
지시어는
사용할 압축수준을 선택한다. 값이 클수록 압축률이 증가하지만,
CPU를 더 많이 사용한다.
(가장 덜 압축) 1과 (가장 많이 압축) 9 사이의 값을 지정한다.
DeflateFilterNote 지시어
설명: | 압축률을 로그에 기록한다 |
---|---|
문법: | DeflateFilterNote [type] notename |
사용장소: | 주서버설정, 가상호스트 |
상태: | Extension |
모듈: | mod_deflate |
지원: | type은 아파치 2.0.45 부터 |
DeflateFilterNote
지시어는 요청의
압축률을 로그에 기록하는 기호를 지정한다. 기호 이름은 지시어로
지정한 값이다. 통계를 위해 접근
로그에서 기호를 사용할 수 있다.
예제
DeflateFilterNote ratio
LogFormat '"%r" %b (%{ratio}n) "%{User-agent}i"' deflate
CustomLog logs/deflate_log deflate
로그에서 더 정확한 값을 추출하려면 type 아규먼트로 기록할 자료를 선택한다. type는 다음중 하나이다:
Input
- 필터 입력스트림의 바이트수를 저장한다.
Output
- 필터 출력스트림의 바이트수를 저장한다..
Ratio
- 압축률을 (
output/input * 100
) 저장한다. type 아규먼트를 생략하면 사용하는 기본값이다.
그래서 이렇게 로그에 기록할 수 있다:
정밀한 로그
DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio
LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
CustomLog logs/deflate_log deflate