Brotli는 범용 LZ77 무손실 압축 알고리듬, Huffman 코딩과 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를 복사해 옵니다.