[Nginx] Nginx에 간단하게 gzip 압축 설정하기

Nginx에 gzip 설정을 추가하자


환경

  • Nginx


웹 사이트 압축?

우리가 흔히 사용하는 웹브라우저 및 통신은 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.confhttp블록 안에 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.confhttp블록에 그대로 추가해주시면 됩니다.

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가 표시됨을 알 수 있습니다.

Response Header


참고자료

[Linux] 쉘 스크립트에서 멀티프로세스(혹은 스레드) 기능 사용하기

> 백그라운드로 명령어를 실행해서 병렬적으로 실행되는 멀티 프로세스 환경을 만들어보자.## 환경- Linux 기반 시스템- Bash shell(/bin/bash)## 멀티프로세스? 병렬처리? 멀티스레드? 백그라운드 프로세스?- 여기서 진행할 방식...… Continue reading