Apache mod_deflate 설정
Apache 2.4 에서 mod_deflate 설정 에 대한 문서 입니다.
Apache 2.2 에비해서 Apache 2.4 에서의 설정이 새롭게 바뀌었습니다.
1. Requirement
Apache 2.4 에서 mod_deflate 를 사용하기 위해서는 다음과 같은 모듈들도 활성화되어야 합니다.
- mod_setenvif : 환경변수를 정의한다.
- mod_headers : HTTP 요청 헤더와 응답 헤더를 조절하고 수정하는 지시어를 제공한다.
- mod_deflate : 서버의 출력을 네트웍으로 클라이언트에 보내기 전에 압축하는 기능 제공
위 모듈들이 Apache 2.4.10 에 활성화 되어 있어야 합니다.
2. 설정
mod_deflate 의 설정은 Apache 2.2 와 2.4 가 차이가 있습니다. 두 버전에 상관없이 설정할 수 있는 방법도 있는데, 이것은 아파치 문서에 나와 있는 방법이기도 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
이미지를 제외한 모든 것을 압축 <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> |
그런데, Apache 2.4 의 Fileter 모듈을 적용해서 특정한 컨텐츠타입에만 Deflate 를 적용하면 다음과 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<ifmodule filter_module> # HTML, TXT, CSS, JavaScript, JSON, XML, HTC: FilterDeclare COMPRESS FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = '$text/html'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = '$text/css'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = '$text/plain'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = '$text/xml'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = '$text/x-component'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = '$application/javascript'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = '$application/json'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = '$application/xml'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = '$application/xhtml+xml'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = '$application/rss+xml'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = '$application/atom+xml'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = '$application/vnd.ms-fontobject'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = '$image/svg+xml'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = '$image/x-icon'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = '$application/x-font-ttf'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = '$font/opentype'" FilterChain COMPRESS FilterProtocol COMPRESS DEFLATE change=yes;byteranges=no </ifmodule> <ifmodule !filter_module> # Legacy versions of Apache AddOutputFilterByType DEFLATE text/html text/plain text/css application/json AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE text/xml application/xml text/x-component AddOutputFilterByType DEFLATE application/xhtml+xml application/rss+xml application/atom+xml AddOutputFilterByType DEFLATE image/x-icon image/svg+xml application/vnd.ms-fontobject application/x-font-ttf font/opentype </ifmodule> |
deflate 를 사용하는데 따라 클라이언트에게 압축된 컨텐츠라는 걸 알려주기 위해서 헤더값을 다음과 같이 조작해 줍니다.
1 2 3 4 5 6 |
<IfModule setenvif_module> <IfModule headers_module> SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding </IfModule> </IfModule> |
이것을 종합하면 다음과 같습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<IfModule deflate_module> <IfModule setenvif_module> <IfModule headers_module> SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding </IfModule> </IfModule> <IfModule filter_module> # HTML, TXT, CSS, JavaScript, JSON, XML, HTC FilterDeclare COMPRESS FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = 'text/html'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = 'text/css'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = 'text/plain'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = 'text/xml'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = 'text/x-component'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = 'application/javascript'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = 'application/json'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = 'application/xml'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = 'application/xhtml+xml'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = 'application/rss+xml'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = 'application/atom+xml'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = 'application/vnd.ms-fontobject'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = 'image/svg+xml'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = 'image/x-icon'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = 'application/x-font-ttf'" FilterProvider COMPRESS DEFLATE "%{CONTENT_TYPE} = 'font/opentype'" FilterChain COMPRESS FilterProtocol COMPRESS DEFLATE change=yes;byteranges=no </IfModule> <IfModule !filter_module> # Legacy versions of Apache AddOutputFilterByType DEFLATE text/html text/plain text/css application/json AddOutputFilterByType DEFLATE application/javascript AddOutputFilterByType DEFLATE text/xml application/xml text/x-component AddOutputFilterByType DEFLATE application/xhtml+xml application/rss+xml application/atom+xml AddOutputFilterByType DEFLATE image/svg+xml application/vnd.ms-fontobject application/x-font-ttf font/opentype </IfModule> </IfModule> |