Сжатие Brotli – это универсальный метод сжатия, широко поддерживаемый браузерами. Это сопоставимо с доступными в настоящее время методами сжатия, поскольку обеспечивает на 20-26% лучшую степень сжатия. Тем не менее, это бесполезно, если веб-сервер не отправляет сжатые текстовые ресурсы с алгоритмом Brotli.
В этой статье мы узнаем, как сжатие работает на сервере и чем оно полезно? Мы также научимся устанавливать сервер Nginx и заставим наш сервер предоставлять сжатые файлы Brotli.
Background
Методы/алгоритмы сжатия повышают производительность веб-сайта за счет уменьшения размера содержимого. Следовательно, сжатые данные требуют небольшого времени загрузки и передачи. Однако у этого есть цена. Серверы используют много вычислительных ресурсов, чтобы обеспечить лучшую степень сжатия. Значит, чем лучше, тем дороже. Таким образом, прилагается много усилий для улучшения форматов сжатия при использовании минимальных циклов процессора.
К настоящему времени наиболее потенциальным форматом сжатия был 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. Перед этим sudo apt-get обновите ваш дистрибутив Ubuntu и введите следующие команды в свой терминал bash.
andreyex@ubuntu:~$ sudo apt-get update andreyex@ubuntu:~$ sudo apt-get install nginx -y andreyex@ubuntu:~$ sudo service nginx start
Чтобы включить сжатие Brotli в Nginx, мы скомпилируем наши модули .so в соответствии с информацией о нашей версии Nginx. Как показано, при вводе следующей команды будет выведена версия Nginx:
andreyex@ubuntu:~$ nginx -v nginx version: nginx/1.18.0 (Ubuntu)
Используйте команду wget вместе со сведениями о вашей версии nginx, чтобы загрузить исходный код с веб-сайта Nginx.
andreyex@ubuntu:~$ wget https://nginx.org/download/nginx-1.18.0.tar.gz --2021-02-07 02:57:33-- https://nginx.org/download/nginx-1.18.0.tar.gz Resolving nginx.org (nginx.org)... 3.125.197.172, 52.58.199.22, 2a05:d014:edb:5702::6, ... Connecting to nginx.org (nginx.org)|3.125.197.172|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 1039530 (1015K) [application/octet-stream] Saving to: 'nginx-1.18.0.tar.gz' nginx-1.18.0.tar.gz 100%[==================================================================>] 1015K 220KB/s in 4.8s 2021-02-07 02:57:38 (212 KB/s) - ‘nginx-1.18.0.tar.gz’ saved [1039530/1039530]
Мы будем использовать этот исходный код для компиляции двоичных файлов *.so для сжатия Brotli. Теперь извлеките файл, используя следующую команду.
andreyex@ubuntu:~$ tar xzf nginx-1.18.0.tar.gz
Конфигурация модуля Brotli
Теперь Google выпустила модуль Brotli для Nginx. Мы будем git-клонировать модуль из репозитория Google: https://github.com/google/ngx_brotli.
andreyex@ubuntu:~$ git clone https://github.com/google/ngx_brotli --recursive.
Мы cd в в Nginx-1.18.0 папку для настройки динамического Brotli модуля.
andreyex@ubuntu:~$ cd nginx-1.18.0/ andreyex@ubuntu:~$ sudo ./configure --with-compat --add-dynamic-module=../ngx_brotli
./configure: error: the HTTP rewrite module requires the PCRE library. You can either disable the module by using --without-http_rewrite_module option, or install the PCRE library into the system, or build the PCRE library statically from the source with nginx by using --with-pcre=<path> option.
В этом случае выполните следующую команду, чтобы установить библиотеку pcre.
andreyex@ubuntu:~$ sudo apt-get install libpcre3-dev -y
Компиляция модуля
Мы будем использовать команду make для создания папки модулей внутри каталога nginx-1.18.0.
Мы используем команду cp для копирования файлов ngx_http_brotli * .so из папки nginx-1.18.0/objs в папку модулей.
andreyex@ubuntu:~$ cd /nginx-1.18.0/objs/ andreyex@ubuntu:~$ sudo cp <strong>ngx_http_brotli*.so </strong>/usr/share/nginx/modules
Теперь перечислите содержимое файлов с помощью команды ls. Вы заметите, что он состоит из двух разных файлов модулей, то есть:
andreyex@ubuntu:~$ ls ngx_http_brotli*.so ngx_http_brotli_filter_module.so ngx_http_brotli_static_module.so
- Обычный модуль Brotli: модуль ngx_http_brotli_filter_module.so сжимает все файлы на лету и, следовательно, требует больше вычислительных ресурсов.
- Статический модуль Brotli: модуль ngx_http_brotli_static_module.so позволяет ему обслуживать предварительно сжатые статические файлы, следовательно, менее ресурсоемкие.
Теперь используйте свой любимый редактор, чтобы открыть файл /etc/nginx/nginx.conf, чтобы добавить модули загрузки Brotli, чтобы начать настройку Brotli, включив следующие строки:
andreyex@ubuntu:~$ sudo vim /etc/nginx/nginx.conf # Load module section load_module "modules/ngx_http_brotli_filter_module.so"; load_module "modules/ngx_http_brotli_static_module.so";
Мы также включим пути к папкам конфигурации /etc/nginx/conf.d/*.conf
и /usr/share/nginx/modules/*.conf в указанном выше файле, например:
http { # Include configs folders include /etc/nginx/conf.d/*.conf; include /usr/share/nginx/modules/*.conf; }
Чтобы добавить конфигурацию Brotli, откройте /etc/nginx/conf.d/brotli.conf
в редакторе vim и включите Brotli, установив следующие директивы конфигурации:
brotli on; brotli_static on; brotli_comp_level 6; brotli_types application/rss+xml application/xhtml+xml text/css text/plain;
Значение «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», и все готово.
Вывод
После внесения изменений вы заметите очевидные улучшения показателей производительности. Однако у него есть небольшой недостаток – повышенная загрузка процессора в часы пик. Чтобы избежать подобных ситуаций, следите за загрузкой процессора; если он регулярно достигает 100%, мы можем использовать множество параметров в соответствии с нашими предпочтениями, например, представление предварительно сжатого или статического содержимого, снижение уровня сжатия и отключение сжатия на лету.