nginx 에 gzip 으로 컨텐츠 압축 설정하기
gtmetrix 같은 웹 사이트 속도 측정 서비스의 결과를 보면 contents compression 을 적용했는지 확인할 수 있는 항목이 있습니다.
컨텐츠 압축은 전송되는 데이타 양을 줄일수 있고 웹 서버 설정만으로 쉽게 적용이 가능하므로 웹 사이트를 튜닝할 때 제일 먼저 적용해야 하는 항목입니다.
압축 설정은 가상 호스트마다 하지 말고 메인 설정 파일(/etc/nginx/nginx.conf) 의 http 블록에 설정하면 전역적으로 적용되므로 편리합니다.
http { include /etc/nginx/mime.types; default_type application/octet-stream; # 압축 설정 }
설정
제일 먼저 설정할 항목은 gzip on; 으로 컨텐츠 압축 사용을 지시하는 것입니다.
http { gzip on; gzip_disable "msie6";
gzip_disable 에는 압축을 적용하지 않을 브라우저를 지정하며 예전 IE 는 압축을 지원하지 않으므로 msie6 는 예외 항목으로 설정합니다.
압축 설정
gzip_comp_level 6; gzip_min_length 500; gzip_buffers 16 8k; gzip_proxied any;
gzip_comp_level : 1 ~ 9까지 설정할 수 있으며 숫자가 클수록 압축율은 올라가지만 압축 속도는 느려집니다.
gzip_min_length: 압축을 적용할 컨텐츠의 최소 사이즈를 지정하며 이보다 작은 파일은 압축하지 않습니다.
gzip_buffers : 버퍼의 숫자와 크기를 지정하며 16은 버퍼의 숫자, 8k 는 크기입니다.
gzip_proxied : proxy 나 캐시 서버에서 요청할 경우 동작 여부를 설정합니다. proxy 여부는 Via 헤더의 존재 여부로 확인하며 다음과 같은 설정이 가능합니다.
off: 프락시에서 요청할 경우 압축하지 않습니다.
expired: 요청 헤더에 Expires 가 있고 만료되었을 경우에만 압축합니다.
- no-cache: 요청 헤더에 Cache-Control 가 있고 no-cache 일 경우에만 압축합니다.
- no-store: 요청 헤더에 Cache-Control 가 있고 no-store 일 경우에만 압축합니다.
- any: 항상 압축합니다.
그 외 가능한 설정은 http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_proxied 를 참고하세요
content type 설정
컨텐츠의 유형에 따라 gzip_types 지시자로 압축 여부를 설정할 수 있으며 아래 설정은 일반적으로 많이 사용하는 컨텐츠 유형에 대해 압축하는 예로 가독성을 위해 개행을 적용했습니다.
gzip_types text/plain text/css text/js text/xml text/javascript application/javascript application/x-javascript application/json application/xml application/rss+xml image/svg+xml;
최종 설정
nginx 의 메인 설정 파일인 nginx.conf 의 http 항목에 다음과 같이 설정하면 됩니다.
압축 여부 확인
압축되고 있는지 확인은 서버의 응답 헤더에 Content-Encoding: gzip 이 포함되었는지 확인하면 되며 Chrome 의 경우 개발자 도구의 Network 탭에서 확인할 수 있습니다.
커맨드에서 확인할 경우 'Accept-Encoding: gzip,deflate' 헤더를 포함해서 curl 을 호출하면 됩니다.
curl -L -I -H 'Accept-Encoding: gzip,deflate' https://google.com