Nginx에 gzip 설정을 추가하자
환경
웹 사이트 압축?
우리가 흔히 사용하는 웹브라우저 및 통신은 HTTP에 기반한 통신이 많습니다.
그러한 웹 통신에서 속도를 개선하기 위해 많은 노력들이 이루어져 왔고 그러한 노력의 결과로 gzip, 브라우저 캐싱, js 및 css 압축 그리고 CDN(contents delivery network)과 같은 여러 방식들이 나왔습니다.
위에 나온 여러 방법들이 존재하지만 nginx에서 가장 쉽게 설정 할 수 있고 웹서비스를 할 때 기본중에 기본인 gzip을 설정하는 방법에 대해서 알아보겠습니다.
gzip이란?
위키피디아에서 가져온 내용을 발췌하면 아래와 같습니다.
gzip은 파일 압축에 쓰이는 응용 소프트웨어이다. gzip은 GNU zip의 준말이며, 초기 유닉스 시스템에 쓰이던 압축 프로그램을 대체하기 위한 자유 소프트웨어이다. gzip은 Jean-loup Gailly와 마크 애들러가 만들었다. 버전 0.1은 1992년 10월 31일에 처음 공개되었으며, 버전 1.0이 1993년 2월에 뒤따라 나왔다. 오픈BSD의 gzip 버전은 더 오래된 압축 프로그램을 기반으로 하고 있으며, 오픈BSD 3.4에 추가되었다.
즉, 쉽게 정리하면 gzip은 압축 프로그램 및 방식이라고 할 수 있습니다. 구체적으로 어떠한 방식과 원리로 압축을 하는지에 대해서는 포스팅하지 않겠으나 LZ77과 허프만 코딩을 조합한 DEFLATE알고리즘에 기반하여 구현한다고 합니다.
Nginx에서 gzip설정하기
Nginx에서 gzip 설정하는 부분
Nginx를 apt-get을 통해서 패키지로 설치를 했다면 /etc/nginx경로에 있는 nginx.conf에서 설정이 가능합니다.
또한 패키지를 통해 설치를 하셨다면 다음처럼 nginx.conf의 http블록 안에 Gzip Settings라고 나와있습니다.
nginx.conf
http {
...
##
# Gzip Settings
##
// 이 아래 설정들이 주석처리 되어있거나 설정되어 있을 수도 있습니다.
gzip on;
gzip_disable "msie6";
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
...
}
Nginx에서 gzip 설정하기
간단하게 위에 있는대로 주석이 nginx.conf에 나와있고 주석을 제거해주시면 되고 만약 해당 부분이 없다면 아래부분을 nginx.conf의 http블록에 그대로 추가해주시면 됩니다.
nginx.conf
...
http{
...
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
...
}
...
각각에 대한 내용은 nginx 공식문서를 참고하면 다음과 같습니다.
gzip [on/orr]: gzip의 설정을 on/off하는 명령어입니다.
gzip_disable [regex]: 해당 명령어 다음에 오는 문장이 요청 헤더에 User-Agent와 일치하면 gzip을 하지 않습니다.
gzip_vary [on/off]: gzip, gzip_static, or gunzip의 설정들이 on으로 되어있을 때 응답 헤더에 “Vary: Accept-Encoding”를 넣을지 말지에 대한 명령어 입니다.
gzip_proxied: 요청과 응답에 따라서 프록시된 요청에 대해서 gzipping을 할지 말지에 대한 설정입니다. “any”로 설정하면 모든 응답에 대해서 gzipping을 수행합니다.
gzip_comp_level [level]: 응답에 대한 압축의 정도를 의미하며 level의 값은 1부터 9까지 가능합니다.
gzip_buffers [num] [size]: num은 버퍼의 갯수를 의미하며 size는 그 버퍼의 크기를 의미합니다.
gzip_http_version [versino]: minimum HTTP 통신의 버전을 정합니다.
gzip_types [types in array]: “text/html”을 제외하고 MIME 타입에서 또 어떠한 응답 형태들을 gzipping 할지 정할 수 있습니다.
Nginx에서 gzip 설정 적용하기
이제 바뀐 설정을 적용해보도록 하겠습니다. 반드시 재시작 했다는 문구가 나와야합니다!
$ sudo /etc/init.d/nginx restart
or
$ sudo service nginx restart
or
$ sudo systemctl restart nginx
적용결과
이제 gzip을 적용하면 제대로된 응답 요청에 대해서(HTTP STATUS CODE가 200) 다음 처럼 응답 헤더에 Content-Encoding:gzip가 표시됨을 알 수 있습니다.

참고자료