включить сжатие Brotli в Nginx

Thank you for reading this post, don't forget to subscribe!

Сжатие Brotli – это уни­вер­саль­ный метод сжа­тия, широ­ко под­дер­жи­ва­е­мый бра­у­зе­ра­ми. Это сопо­ста­ви­мо с доступ­ны­ми в насто­я­щее вре­мя мето­да­ми сжа­тия, посколь­ку обес­пе­чи­ва­ет на 20-26% луч­шую сте­пень сжа­тия. Тем не менее, это бес­по­лез­но, если веб-сер­вер не отправ­ля­ет сжа­тые тек­сто­вые ресур­сы с алго­рит­мом Brotli.

Методы/алгоритмы сжа­тия повы­ша­ют про­из­во­ди­тель­ность веб-сай­та за счет умень­ше­ния раз­ме­ра содер­жи­мо­го. Сле­до­ва­тель­но, сжа­тые дан­ные тре­бу­ют неболь­шо­го вре­ме­ни загруз­ки и пере­да­чи. Одна­ко у это­го есть цена. Сер­ве­ры исполь­зу­ют мно­го вычис­ли­тель­ных ресур­сов, что­бы обес­пе­чить луч­шую сте­пень сжа­тия. Зна­чит, чем луч­ше, тем доро­же. Таким обра­зом, при­ла­га­ет­ся мно­го уси­лий для улуч­ше­ния фор­ма­тов сжа­тия при исполь­зо­ва­нии мини­маль­ных цик­лов процессора.

К насто­я­ще­му вре­ме­ни наи­бо­лее потен­ци­аль­ным фор­ма­том сжа­тия был gzip. Недав­но на сме­ну gzip при­шел новый алго­ритм сжа­тия, извест­ный как Brotli. Это усо­вер­шен­ство­ван­ный алго­ритм сжа­тия, состо­я­щий из коди­ро­ва­ния Хафф­ма­на, алго­рит­ма L77 и кон­текст­но­го моде­ли­ро­ва­ния. Напро­тив, Gzip постро­ен на алго­рит­ме Deflate.

Фор­мат сжа­тия без потерь, раз­ра­бо­тан­ный Google, тес­но свя­зан с фор­ма­том сжа­тия deflate. Оба мето­да сжа­тия исполь­зу­ют сколь­зя­щие окна для обрат­ных ссы­лок. Раз­мер сколь­зя­ще­го окна Brotli состав­ля­ет от 1 КБ до 16 МБ. Напро­тив, Gzip име­ет фик­си­ро­ван­ный раз­мер окна 32 КБ. Это озна­ча­ет, что окно Brotli в 512 раз боль­ше, чем окно deflate, что не име­ет зна­че­ния, посколь­ку тек­сто­вые фай­лы раз­ме­ром более 32 КБ ред­ко нахо­дят­ся на веб-серверах.

Совместимость с серверным сжатием важна

Каж­дый раз, когда мы загру­жа­ем файл из бра­у­зе­ра, бра­у­зер запра­ши­ва­ет сер­вер, какой тип сжа­тия он под­дер­жи­ва­ет, через заго­ло­вок. Напри­мер, если бра­у­зер под­дер­жи­ва­ет gzip и deflate для рас­па­ков­ки. Он доба­вит эти пара­мет­ры в свой заго­ло­вок Accept-Encoding:

Accept-Encoding=”deflate, gzip”

 

Сле­до­ва­тель­но, бра­у­зе­ры, кото­рые не под­дер­жи­ва­ют эти фор­ма­ты, не будут вклю­чать их в заго­ло­вок. Когда сер­вер отве­ча­ет кон­тен­том, он сооб­ща­ет бра­у­зе­ру о фор­ма­те сжа­тия через заго­ло­вок Content-Encoding. Сле­до­ва­тель­но, если он под­дер­жи­ва­ет gzip, то заго­ло­вок выгля­дит так:

Content-Encoding=”gzip”

 

Заго­лов­ки бра­у­зе­ров, таких как Firefox, кото­рые под­дер­жи­ва­ют сжа­тие Brotli, и веб-сер­ве­ра, на кото­ром уста­нов­лен модуль Brotli, выгля­дят сле­ду­ю­щим образом:

Accept-Encoding=”deflate, gzip, br”
Content-Encoding=”gzip, br”

 

Сле­до­ва­тель­но, если бра­у­зер исполь­зу­ет луч­ший фор­мат сжа­тия, а веб-сер­вер – нет, это бес­по­лез­но, посколь­ку веб-сер­вер не будет отправ­лять обрат­но фай­лы с пред­по­чти­тель­ным алго­рит­мом сжа­тия. Вот поче­му так важ­но уста­но­вить модуль сжа­тия для веб-сервера.

Преж­де чем про­дол­жить настрой­ку Brotli, мы настро­им наш сер­вер Nginx.

yum install nginx -y

Что­бы вклю­чить сжа­тие Brotli в Nginx, мы ском­пи­ли­ру­ем наши моду­ли .so в соот­вет­ствии с инфор­ма­ци­ей о нашей вер­сии Nginx. Как пока­за­но, при вво­де сле­ду­ю­щей коман­ды будет выве­де­на вер­сия Nginx:

 

Исполь­зуй­те коман­ду wget вме­сте со све­де­ни­я­ми о вашей вер­сии nginx, что­бы загру­зить исход­ный код с веб-сай­та Nginx.

 

Мы будем исполь­зо­вать этот исход­ный код для ком­пи­ля­ции дво­ич­ных фай­лов *.so для сжа­тия Brotli. Теперь извле­ки­те файл, исполь­зуя сле­ду­ю­щую команду.

Конфигурация модуля Brotli

Теперь Google выпу­сти­ла модуль Brotli для Nginx. Мы будем git-кло­ни­ро­вать модуль из репо­зи­то­рия Google: https://github.com/google/ngx_brotli.

 

Мы cd в в Nginx-1.18.0 пап­ку для настрой­ки дина­ми­че­ско­го Brotli модуля.

Вы може­те полу­чить сле­ду­ю­щую ошиб­ку при настройке

В этом слу­чае выпол­ни­те сле­ду­ю­щую коман­ду, что­бы уста­но­вить биб­лио­те­ку pcre.

Компиляция модуля

Мы будем исполь­зо­вать коман­ду make для созда­ния пап­ки моду­лей внут­ри ката­ло­га nginx-1.18.0.

andreyex@1:~$ make modules

 

Мы исполь­зу­ем коман­ду cp для копи­ро­ва­ния фай­лов ngx_http_brotli * .so из пап­ки nginx-1.18.0/objs в пап­ку модулей.

 

Теперь пере­чис­ли­те содер­жи­мое фай­лов с помо­щью коман­ды ls. Вы заме­ти­те, что он состо­ит из двух раз­ных фай­лов моду­лей, то есть:

  • Обыч­ный модуль Brotli: модуль ngx_http_brotli_filter_module.so сжи­ма­ет все фай­лы на лету и, сле­до­ва­тель­но, тре­бу­ет боль­ше вычис­ли­тель­ных ресурсов.
  • Ста­ти­че­ский модуль Brotli: модуль ngx_http_brotli_static_module.so поз­во­ля­ет ему обслу­жи­вать пред­ва­ри­тель­но сжа­тые ста­ти­че­ские фай­лы, сле­до­ва­тель­но, менее ресурсоемкие.

Теперь исполь­зуй­те свой люби­мый редак­тор, что­бы открыть файл /etc/nginx/nginx.conf, что­бы доба­вить моду­ли загруз­ки Brotli, что­бы начать настрой­ку Brotli, вклю­чив сле­ду­ю­щие строки:

 

Мы так­же вклю­чим пути к пап­кам кон­фи­гу­ра­ции /etc/nginx/conf.d/*.conf

и /usr/share/nginx/modules/*.conf в ука­зан­ном выше фай­ле, например:

 

Что­бы доба­вить кон­фи­гу­ра­цию Brotli, открой­те /etc/nginx/conf.d/brotli.conf

в редак­то­ре vim и вклю­чи­те Brotli, уста­но­вив сле­ду­ю­щие дирек­ти­вы конфигурации:

 

Зна­че­ние «brotli off|on» вклю­ча­ет или отклю­ча­ет дина­ми­че­ское сжа­тие содер­жи­мо­го или сжа­тие «на лету».

Пара­метр ‘brotli_ static on’ поз­во­ля­ет сер­ве­ру Nginx про­ве­рять, суще­ству­ют ли пред­ва­ри­тель­но сжа­тые фай­лы с рас­ши­ре­ни­я­ми .br или нет. Мы так­же можем вклю­чить этот пара­метр в пара­метр « выклю­че­но» или « все­гда». Зна­че­ние always поз­во­ля­ет сер­ве­ру отправ­лять пред­ва­ри­тель­но сжа­тый кон­тент без под­твер­жде­ния, под­дер­жи­ва­ет его бра­у­зер или нет. Посколь­ку Brotli явля­ет­ся ресур­со­ем­ким, этот модуль луч­ше все­го под­хо­дит для умень­ше­ния коли­че­ства узких мест.

В «brotli_comp_level 6» уста­нав­ли­ва­ет дина­ми­че­ский уро­вень каче­ства сжа­тия до 6. Это может быть в диа­па­зоне от 0 до 11.

Нако­нец, вклю­чи­те дина­ми­че­ское сжа­тие для опре­де­лен­ных типов MIME, тогда как отве­ты text/html все­гда сжи­ма­ют­ся. Син­так­сис по умол­ча­нию для этой дирек­ти­вы – brotli_types [type mime]. Вы може­те най­ти боль­ше о дирек­ти­ве кон­фи­гу­ра­ции на Github .

Сохра­ни­те изме­не­ния, пере­за­пу­сти­те служ­бу Nginx, набрав «sudo service restart nginx», и все готово.