[Nginx] Compressed Response with gzip

반응형

이번글에서는 static resource의 delivery 성능을 향상시키는 방법에 대해 알아보도록 하겠습니다.

1. Compressed Response란?

response data를 압축해서 return 하는 방법입니다.

예를 들어 client가 nginx에 static resource를 request 할때 자신들은 compressed data를 accept 할 수 있다고 indicate 할 수 있습니다.

image.png

그렇다면 nginx는 아래와 같이 static response를 압축해서 client 한테 전달합니다. 이후 client browser에서 compressed data를 unzip 해서 rendering 하는 것은 automatic 하게 처리하기 때문에 nginx에서는 해당 부분은 고민할 필요가 없습니다.

✔ 현대의 모든 modern browser는 대부분 compressed data를 accept 합니다.

image.png

위와 같이 data를 zip 해서 전달하게되면 file size가 작아지기 때문에 그만큼 client에서 해당 response data를 받는 시간이 줄어들게됩니다.

2. Set gzip

compressed response에서 가장 많이 사용되는 gzip을 적용해보겠습니다.

2-1) on/off

gzip은 nginx core에 포함되어 있기때문에 http context 내부에서 선언해 사용할 수 있습니다.

gzip on;

2-2) compression level

또한 gzip을 사용하기위해선 gzip compression level을 명시해줘야 합니다.

gzip_comp_level 3;

compression level은 static file을 압축하는 단계를 의미하며, 숫자가 크면 클수록 resource 크기가 더 작아지게 압축합니다.

image.png

compression level이 크면 클수록 response resource의 크기는 줄어드는 대신 그만큼 server에서 해당 resource를 zip하기 위한 resource가 많이 사용되므로, 너무 높은 compression level은 server에 부담을 주게됩니다.

image.png

따라서 각 service의 enviroment 별로 compression level을 적절히 설정해 사용해야 하며, 대부분의 경우에는 3~4 level이 적절합니다.

2-3) comporession type

마지막으로 compression response를 사용할 data type을 아래와 같이 직접 명시해줘야 합니다.

gzip_types text/css text/javascript;

3. Test

아래와 같이 nginx.conf를 변경 후 테스트 해보겠습니다 😎.

image.png

앞서 말씀드렸다싶이 compressed response로 data를 return 하기 위해선 client 에서 request를 날릴때 accept compressed data를 indicate를 해야합니다.

따라서, 이를 test 하기 위해 curl 구문에 header 정보를 추가하면 content type이 gzip으로 encoding 된 것을 확인할 수 있습니다.

curl -I -H "Accept-Encoding: gzip"

image.png

만약 request에 header를 추가하지 않을 경우 response data는 아래와 같이 그대로 encoding 되지 않은 상태로 return 하게 됩니다.

image.png

실제로 request를 날려보면 compressed response의 data 크기가 현저히 줄어드는 것을 확인할 수 있습니다.

image.png

따라서 compresse reponse를 활용해 static data를 return 할 경우, 기존보다 빠르게 client에 response data를 return 할 수 있게됩니다. 👏👏👏


참고 자료 : https://www.udemy.com/course/nginx-fundamentals/


반응형

'Nginx' 카테고리의 다른 글

[Nginx] HTTP/2  (0) 2020.08.31
[Nginx] FastCGI Cache  (0) 2020.08.31
[Nginx] Header & Expire  (0) 2020.08.31
[Nginx] Adding Dynamic Module  (0) 2020.08.31
[Nginx] Buffer & Timeout  (0) 2020.08.27

댓글

Designed by JB FACTORY