04 ноября 2021

Как я в Nginx из Debian поддержку сжатия brotli добавлял.

 

Brotli - это алгоритм сжатия данных с открытым исходным кодом, распространяется по лицензии MIT. Немного технической информации можно почитать в Wikipedia и в RFC7932.

Модуль для поддержки этого алгоритма есть в платном варианте платформы Nginx Plus, но ничего не мешает добавить поддержку и в вариант из репозитория Debian. Сам сервер пересобирать для этого не надо.
Я действовал по инструкции, которую взял из репозитория самого модуля, и пытался адаптировать её для сборки в Debian.

Подготовка сборки.
 
Сначала надо проверить, что в списке репозиториев есть необходимые записи для получения исходных кодов пакетов. У меня основной репозиторий прописан так (вместо "bullseye" можно прописать "stable"):
deb https://cdn-fastly.deb.debian.org/debian/ bullseye main contrib non-free
deb-src https://cdn-fastly.deb.debian.org/debian bullseye main contrib non-free
Теперь нужно обновить список пакетов и загрузить исходный код Nginx. Делать всё желательно в отдельном каталоге, чтобы потом было легче удалить ненужные файлы.
mkdir nginx
cd nginx
apt source nginx
В каталог "nginx" будет загружен и распакован исходный код сервера, а так же будут наложены необходимые для сборки патчи. Для правильной сборки необходимо установить сборочные зависимости, которые потом можно будет удалить, сохранив где-нибудь список, выданный программой "apt". Отдельно надо установить dev-пакет "libbrotli".
sudo apt build-dep nginx
sudo apt install libbrotli-dev
Настройка и сборка модулей.
 
В руководстве сказано, что настраивать сборку надо точно с теми же параметрами, с которыми настроен установленный сервер. Получить список параметров можно из информации о версии самого сервера:
$ /usr/sbin/nginx -V
nginx version: nginx/1.18.0
built with OpenSSL 1.1.1k  25 Mar 2021
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -ffile-prefix-map=/build/nginx-q9LD4J/nginx-1.18.0=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-compat --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_sub_module
Вот тот огромный список параметров из строки "configure arguments" как раз и нужен.

Теперь необходимо получить исходный код модуля, сконфигурировать сборку и собрать сами модули.

Для указания скрипту конфигурации каталога с исходным кодом надо добавить ключ "--add-dynamic-module=/путь/до/ngx_brotli".
# получение исходного кода
git clone https://github.com/google/ngx_brotli
cd nginx-1.18.0
# конфигурирование
# вместо "..." надо подставить тот огромный список параметров
./configure ... --add-dynamic-module=/путь/до/ngx_brotli
# сборка модулей
make modules
После сборки в каталоге "objs" должны появиться файлы "ngx_http_brotli_filter_module.so" и "ngx_http_brotli_static_module.so". Это и есть нужные модули.

Установка модулей.

Файлы необходимо поместить в каталог "/usr/lib/nginx/modules". В каталоге "/etc/nginx/modules-available" надо создать файл "mod-http-brotli.conf" с таким текстом:
load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_brotli_static_module.so;
А символическую ссылку на этот файл поместить в каталог "/etc/nginx/modules-enabled". На этом этапе модуль добавлен, но ещё не настроен на использование.

Настройка Nginx.
 
Я все свои настройки, которые не относятся к сайтам, помещаю в каталог "/etc/nginx/conf.d". Туда надо поместить файл с расширением ".conf" и примерно таким текстом:
# включение сжатие brotli
brotli on;
# уровень сжатия максимальный
brotli_comp_level 11;
# MIME-типы, для которых надо задействовать сжатие
brotli_types application/atom+xml application/javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-opentype application/x-font-truetype application/x-font-ttf application/x-javascript application/xhtml+xml application/xml font/eot font/opentype font/otf font/truetype image/svg+xml image/vnd.microsoft.icon image/x-icon image/x-win-bitmap text/css text/javascript text/plain text/xml;
После этого надо перезапустить сервер Nginx:
sudo systemctl restart nginx
Проверка.
 
Для проверки сжатия можно использовать инструменты веб-разработчика браузера Firefox или Chrome или программу "curl" с ключами "--compressed -v". Если всё сделано правильно, то в заголовке ответа сервера должна быть строка:
content-encoding: br

-->