Brotli
![]() | |
Original author(s) | Jyrki Alakuijala, Zoltán Szabadka |
---|---|
Developer(s) | Jyrki Alakuijala, Eugene Kliuchnikov, Robert Obryk, Zoltán Szabadka, Lode Vandevenne, Mislav Bradač |
Initial release | 15 October 2013 |
Stable release | 1.0.9
/ 27 August 2020[1] |
Written in | C |
Operating system | Cross-platform |
Platform | Portable |
Type | Data compression |
License | MIT License |
Brotli는 범용 LZ77 무손실 압축 알고리듬, Huffman 코딩과 2차 컨텍스트 모델링의 특정 조합으로 압축된 데이터 스트림에 대해 데이터 형식 사양입니다.[2] Brotli는 구글에 의해 개발된 압축 알고리듬으로 텍스트 압축에 가장 적합합니다. Brotli는 주로 웹 서버와 콘텐츠 전송 네트워크에 의해 HTTP 콘텐츠를 압축하여 인터넷 웹사이트를 더 빠르게 로드하기 위해 사용됩니다. gzip의 후속 프로그램으로, gzip보다 더 나은 압축을 제공하므로, 모든 주요 웹 브라우저에 의해 지원되고 점점 더 대중화되고 있습니다.
Installation
엔진엑스에서, 컨텐츠를 압축해서 전송함으로써 대기 시간을 줄일 수 있습니다. 데비안에서 기본값으로 gzip을 통해서 압축하지만, 구글에서 새롭게 만든 brotli를 이용하면, 더 대기 시간을 줄일 수 있다고 합니다.
먼저 압축 프로그램을 설치합니다.
- sudo apt install brotli
아래 과정이 귀찮은 분들은 우분투 PPA의 패키지를 이용할 수 있습니다.
한편, Google PageSpeed for nginx에서 새로운 모듈을 엔진엑스에 추가해서 컴파일 하는 방법을 소개하고 있습니다. 같은 디텍토리 구조에서 소스를 받아서 엔진엑스를 컴파일할 수 있습니다.
즉, 엔진엑스의 소스가 풀려져 있는 상위 디렉토리에서 다음을 수행하십시오.
- git clone https://github.com/google/ngx_brotli.git
- cd ngx_brotli
- git submodule update --init --recursive
- cd ../nginx-1.15.9
- 2개의 파일을 수정합니다.
- nano debian/changelog
nginx (1.15.9-0ubuntu1.2) cosmic; urgency=medium * add-module ngx_brotli -- user <user@email.com> Sun, 17 Mar 2019 11:15:07 +0900 nginx (1.15.9-0ubuntu1.1) cosmic; urgency=medium * New upstream release (1.15.9) for cosmic * add-module ngx_pagespeed
- nano debian/rules
--prefix=/usr/share/nginx \ --conf-path=/etc/nginx/nginx.conf \ --add-module=../../../incubator-pagespeed-ngx-1.13.35.2-stable \ --add-module=../../../ngx_brotli \ --http-log-path=/var/log/nginx/access.log \
- dpkg-buildpackge -i -uc -us -b
- cd ..
- dpkg -l | grep nginx
- 해당하는 파일을 한꺼번에 설치해 줍니다.
- sudo dpkg -i nginx........
이제 엔진엑스의 설정을 수정합니다.
- sudo nano /etc/nginx/nginx.conf
# gzip on; 등의 이전 설정은 주석처리하세요. brotli on; brotli_static on; # brotli_comp_level 11; # this setting can vary from 1-11 기본값은 6입니다. brotli_types *; # MIME 형식은 개별적으로 지정해도 좋습니다.
엔진엑스를 테스트하고 이상이 없으면 재시작합니다.
- sudo nginx -t
- sudo systemctl restart nginx
제대로 모듈이 작동하는지 확인을 위해서, 아래 웹-사이트를 방문하고 주소를 입력해 보십시오.
함께, 구글 Insights를 방문해 보십시오.
- 그렇게 중요하지 않는 자바스크립트와 CSS 파일을 수정하고 나서, 매번 점수는 다르지만, 모바일과 데스크탑 둘 다 90점은 넘는 것으로 보입니다.
Varnish configuration
기존에 gzip으로 판정되고 있는 부분을 일부 수정하여 사용하던 것을 다음 정보에 따라 수정했습니다. 기존 설정에서 조금 차이가 있을 수 있는데, 적절한 자리에 추가하시면 될 듯 합니다.
sub vcl_recv { if(req.http.Accept-Encoding ~ "br" && req.url !~ "\.(jpg|png|gif|gz|mp3|mov|avi|mpg|mp4|swf|wmf)$") { set req.http.X-brotli = "true"; } } # The data on which the hashing will take place sub vcl_hash { if(req.http.X-brotli == "true" && req.http.X-brotli-unhash != "true") { hash_data("brotli"); } } sub vcl_backend_fetch { if(bereq.http.X-brotli == "true") { set bereq.http.Accept-Encoding = "br"; unset bereq.http.X-brotli; } } sub vcl_purge { # repeat purge for brotli or gzip object # (force hash/no hash on "brotli" while doing another purge) # set Accept-Encoding: gzip so that we don't get brotli-encoded response upon purge if (req.url !~ "\.(jpg|png|gif|gz|mp3|mov|avi|mpg|mp4|swf|wmf)$" && !req.http.X-brotli-unhash) { if (req.http.X-brotli == "true") { set req.http.X-brotli-unhash = "true"; set req.http.Accept-Encoding = "gzip"; } else { set req.http.X-brotli-unhash = "false"; set req.http.Accept-Encoding = "br"; } return (restart); } }
Add dynamic module
다른 패키지로부터 수정할 내용을 기록해 둡니다:
- rules, control 파일에서 brotli를 찾아서 추가합니다.
- debian/modules/brotli를 복사해 옵니다.
- debian/libnginx-mod-brotli.nginx을 복사해 옵니다.
- debian/libnginx-mod.conf/mod-brotli.conf를 복사해 옵니다.
References
- ^ "Releases - google/brotli". Retrieved 13 September 2020 – via GitHub.
- ^ Alakuijala, Jyrki; Szabadka, Zoltan (2016), RFC 7932: Brotli Compressed Data Format, Internet Engineering Task Force Request for Comments, Fremont, CA: IETF Trust.
- - Finley, Klint (22 September 2015), "Hooli, I Mean Google, Gives Away Compression Code for Free", Wired Online, wired.com.