NGINX Gzip 설정하기

HYEONG HWAN, MUN/ 12월 16, 2017/ 미분류/ 6 comments

https://blog.lael.be/post/6553

* GZIP 이란?

Gzip 은 GNU zip 의 줄임말이며 리눅스/유닉스 시스템에서 널리쓰이는 압축 소프트웨어 이다. 웹서버 통신을 할 떄 데이터를 gzip 압축하여 전송하면 속도가 더 빨라진다.

* gzip 사용 안할 경우 : [서버에서 HTML 데이터 전송] -> [클라이언트 브라우저가 표시]
* gzip 을 사용할 경우 : [서버에서 HTML 데이터를 압축 후 전송] -> [클라이언트 브라우저가 압축을 풀고 표시]

gzip 을 사용할 경우, 웹서버클라이언트(브라우저)CPU 사용량이 약간 늘어난다. 요즘 서버나 PC의 경우 충분히 고사양이기 때문에 gzip cpu 사용량은 무시해도 된다.(0.1% 미만)
압축 전송이기 때문에 전송속도가 빨라지고 , 트래픽량이 줄어든다. 특히, 국가간 트래픽이나 느린 인터넷 환경에서, 속도가 빨라진 것을 크게 느낄 수 있다.
너무 작은 파일은 그냥 전송하는게 더 빠르고, 이미 충분히 압축된 파일은 gzip 을 해도 용량이 별로 안줄어들기 때문에 gzip 압축 전송을 안 쓰는 것이 좋다.

적당한 크기의, 압축 효율이 있을만한 것들에 대해서 압축 전송을 사용하는 것이 좋다.

따라서 다음과 같이 최소 파일크기 제한 및 파일타입 제한을 두는 것이다.

항상, 텍스트 데이터는 압축효율이 좋다.
일반적으로, 바이너리 데이터는 압축효율이 좋지 않다. 압축 후 데이터 크기가 더 커질 수 있다.

Image, video, pdf, zip 등은 이미 충분히 압축된 바이너리 파일이므로 gzip 을 적용하면 안된다. (데이터 크기가 줄어든다는 보장이 없고, 불필요한 압축 & 해제 단계가 추가된다. 당연한 이야기지만 데이터 사이즈가 커질수록 cpu 사용량이 늘어난다. )

 

* 환경설정

# vi /etc/nginx/nginx.conf

#gzip on; 을 찾아서 다음과 같이 바꾼다.

    #gzip  on;
    gzip on;
    gzip_min_length  10240;
    gzip_buffers  32 32k;
    gzip_comp_level 9;
    gzip_types    text/plain application/x-javascript text/xml text/css application/json;
    gzip_vary on;
    # end gzip configuration

10KB 이상인 파일이고, type 이 text/plain application/x-javascript text/xml text/css 에 대해서 압축 전송 실시한다.

압축 단계는 1~9 단계를 설정할 수 있는데, 아주 많은 테스트를 한 결과 9 단계가 항상 좋은 결과를 나타내더라.
무조건 9단계의 압축을 사용하도록 하자.

다른 사람의 가이드 글을 더 검색을 해봤는데 압축단계는 6 아니면 9 로 하더라. 본인 체감상 더 빠른것을 선택하면 된다. 아무튼 제 추천은 9단계.

 

크롬 개발자도구 켜고 Network 탭에가서 효율을 살펴보자.

< 같은 페이지를 gzip 을 사용해서 트래픽을 90% 낮춘 예제 >

6 Comments

  1. 매일 tar -czpf 로 압축해서
    dropbox로 업로드 중입니다.

    혹시 home 디렉토리를 gzip으로 하게 되면
    좀더 이득이 있을까요?

    백업 방법 알려주셔서
    데이터를 살릴수있었습니다.
    거듭 감사드립니다.

    1. 안녕하세요.
      백업은 조각조각 하는게 좋습니다. 복구나 백업할 때 시간이 덜 걸립니다.

  2. 이 기능을 사용하려 하는데..

    최신버전이라 그런지 위의 내용과는 좀 다른거같습니다.

    아래와같이 보이는곳에서 gzip만 on으로 하나만 바꾸면 되는걸가요???

    user www-data;
    worker_processes 8;

    error_log /var/log/nginx/error.log warn;
    pid /var/run/nginx.pid;

    events {
    worker_connections 1024;
    }

    http {

    client_max_body_size 200M;
    server_tokens off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘
    ‘$status $body_bytes_sent “$http_referer” ‘
    ‘”$http_user_agent” “$http_x_forwarded_for”‘;

    access_log /var/log/nginx/access.log main;

    sendfile on;
    #tcp_nopush on;

    keepalive_timeout 65;

    gzip on;

    include /etc/nginx/conf.d/*.conf;
    }

    위와같이 되있네요 레벨 설정하는것도 없고 타입 설정하는게 없네요

    1. 따로 레벨과 타입을 설정하지 않으면 nginx 에서 설정한 기본값이 설정됩니다.
      레벨과 타입은 따로 설정하는 것이 좋습니다.

      1. 답변 감사합니다,, 따로 설정을 넣어줘야하는군요,

        이미지파일 같은경우엔 어떻게 해야할까요?

        1. 일반적으로 압축효율이 높다고 알려진 텍스트 데이터만 압축하셔야 합니다.
          이미지, 영상, 오디오 같은 바이너리 데이터는 압축의 이득이 없거나 오히려 데이터가 커질 수 있습니다.

Leave a Comment

작성하신 댓글은 관리자의 수동 승인 후 게시됩니다.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
*
*