Стандартным методом установки софта в Linux сегодня является использование бинарных пакетов. В некоторых средах используются готовые образы контейнеров. Однако, умение собирать Angie из исходных кодов открывает широкие дополнительные возможности. Погрузимся в этот непростой процесс и обсудим, зачем может пригодиться сборка из исходников.
Навигация по циклу
Настройка location в Angie. Разделение динамических и статических запросов.
Перенаправления в Angie: return, rewrite и примеры их применения.
Сжатие текста в Angie: статика, динамика, производительность.
Сборка Angie из исходных кодов.
Видеоверсия
Для вашего удобства подготовлена видеоверсия этой статьи, доступна на Rutube, VKVideo и YouTube.
Исходные коды Angie
Процесс сборки начинается с получения исходных кодов. Проще всего получить архив с исходниками Angie с официального сайта. Там есть архивы для релизных версий сервера. Такой вариант рекомендован для промышленного использования. Например, для версии 1.11.8:
curl -O "https://download.angie.software/files/angie-1.11.8.tar.gz"
Далее любым удобным способом распаковываем архив, например:
tar -xpf angie-1.11.8.tar.gz
Второй вариант — получить новейший код из репозитория:
git clone http://git.angie.software/web-server/angie.git
Так мы получим новейшую версию в разработке. Такой вариант будет полезен для изучения новых возможностей, проведения экспериментов и участия в разработке проекта.
Теперь у нас есть копия исходных кодов сервера, включая штатные модули. Можно переходить к конфигурации и установке зависимостей.
Подготовка к сборке
Перед сборкой необходимо собрать информацию о системе и указать нужные нам параметры. Для этих целей в корне дерева исходных кодов есть скрипт configure. Через параметры вызова configure можно задавать целевые настройки сервера, комплектацию сборки (модули), пути поиска зависимостей и размещения служебных файлов. Полный список параметров очень обширный и приведён на странице документации по сборке. Для упрощения задачи подбора этих параметров, можно позаимствовать их из готового пакета с Angie. Достаточно установить его в систему (целевую или похожую по ветке дистрибутива) и выполнить команду angie ‑V, параметры будут указаны в строке configure arguments:
configure arguments: --prefix=/etc/angie --conf-path=/etc/angie/angie.conf --error-log-path=/var/log/angie/error.log --http-log-path=/var/log/angie/access.log --lock-path=/run/angie.lock --modules-path=/usr/lib/angie/modules --pid-path=/run/angie.pid --sbin-path=/usr/sbin/angie --http-acme-client-path=/var/lib/angie/acme --http-client-body-temp-path=/var/cache/angie/client_temp --http-fastcgi-temp-path=/var/cache/angie/fastcgi_temp --http-proxy-temp-path=/var/cache/angie/proxy_temp --http-scgi-temp-path=/var/cache/angie/scgi_temp --http-uwsgi-temp-path=/var/cache/angie/uwsgi_temp --user=angie --group=angie --with-file-aio --with-http_acme_module --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-http_v3_module --with-mail --with-mail_ssl_module --with-stream --with-stream_acme_module --with-stream_mqtt_preread_module --with-stream_rdp_preread_module --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-threads --feature-cache=../angie-feature-cache --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,--package-metadata=%7B%22type%22:%22deb%22%2C%22os%22:%22ubuntu%22%2C%22name%22:%22angie%22%2C%22version%22:%221.11.8-1~resolute%22%2C%22architecture%22:%22amd64%22%7D -flto=auto -ffat-lto-objects -Wl,-z,relro -Wl,-z,now'
На основе этих параметров можно формировать нужные варианты кастомных сборок. При этом большинство путей и настроек будет совпадать с официальной сборкой в пакете, что сильно упрощает переход на кастомную версию Angie.
Другой вариант посмотреть параметры — запустить временный контейнер и получить параметры из него:
docker run -it --pull always --rm docker.angie.software/angie angie -V
Важно, что нужно учитывать базовый дистрибутив образа контейнера.
Итак, у нас есть базовый набор параметров для запуска скрипта configure. Здесь начинается следующий этап: работа с зависимостями.
Установка зависимостей
Зависимости это как правило библиотеки или другие системные компоненты, которые требуются для сборки веб‑сервера. Также необходимо обеспечить наличие инструментов сборки. Наличие зависимостей проверяется на этапе выполнения скрипта configure. Если запустить скрипт на чистой системе, то сразу получим ошибку при поиска C‑компилятора.
./configure ... checking for OS + Linux 7.0.0-22-generic x86_64 checking for C compiler ... not found ./configure: error: C compiler cc is not found
Как правило, инструменты сборки не установлены по умолчанию. Чтобы установить необходимые компоненты, в Ubuntu удобно воспользоваться мета‑пакетом build‑essential.
apt install build-essential
После установки пакета запускаем скрипт configure снова и видим ту же ошибку. Установили не тот пакет? Нет, дело в параметре --feature-cache=../angie-feature-cache. Он включает кэш для определения системных компонентов и зависимостей. Основная задача — ускорение сборки множества пакетов сторонних модулей для официального репозитория. Поэтому повторный поиск компилятора не проводился и мы получаем ошибку наличия из кэша. Для большинства случаев кэш лучше вообще отключить (убрать параметр feature-cache), тогда такой проблемы не будет. Если вы всё-так используете его, то очищаем кэш и запускаем скрипт снова:
rm -rf ../angie-feature-cache/ ./configure ...
На этот раз получаем больше успешных проверок, но ошибка наверняка появится. Дело в том, что для сборки необходимы различные библиотеки, причём установленные в версии для разработки (суффикс ‑dev для Debian‑дистрибутивов или ‑devel для RedHat). Список библиотек зависит от набора модулей при сборке. В нашем случае (Ubuntu 26.04) при попытке сборки с параметрами из пакета не хватает библиотеки PCRE (требуется для модуля rewrite). Ошибка выглядит так:
... checking for PCRE2 library ... not found checking for PCRE library ... not found checking for PCRE library in /usr/local/ ... not found checking for PCRE library in /usr/include/pcre/ ... not found checking for PCRE library in /usr/pkg/ ... not found checking for PCRE library in /opt/local/ ... not found checking for PCRE library in /opt/homebrew/ ... not found ./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 Angie by using --with-pcre=<path> option.
Чтобы решить эту проблему есть два пути: установить пакет ‑dev‑версии библиотеки в систему или собрать библиотеку статически вместе с Angie из исходных кодов (для этого указать параметр (--with‑pcre=путь к исходникам библиотеки).
Здесь стоит сделать лирическое отступление на тему динамической и статической линковки. Динамическая линковка означает указание ссылок на пути внешних библиотек и использование их совместно с другим софтом. Для такого метода библиотека должна быть установлена в систему и находиться в одной из стандартных директорий (/usr/lib, /usr/lib64 и так далее).
Статическая линковка подразумевает интеграцию библиотек в исполняемый файл angie. Сборка кода библиотеки происходит во время сборки сервера и мы перестаём зависеть от системных библиотек. В результате исполняемый файл будет больше по размеру, но иметь меньше внешних зависимостей.
Проверить динамическую линковку исполняемого файла можно с помощью утилиты ldd:
ldd /usr/sbin/angie-nodebug linux-vdso.so.1 (0x000075bf8008d000) libcrypt.so.1 => /usr/lib/x86_64-linux-gnu/libcrypt.so.1 (0x000075bf8003b000) libm.so.6 => /usr/lib/x86_64-linux-gnu/libm.so.6 (0x000075bf7ff15000) libpcre2-8.so.0 => /usr/lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x000075bf7fb54000) libssl.so.3 => /usr/lib/x86_64-linux-gnu/libssl.so.3 (0x000075bf7fa46000) libcrypto.so.3 => /usr/lib/x86_64-linux-gnu/libcrypto.so.3 (0x000075bf7f400000) libz.so.1 => /usr/lib/x86_64-linux-gnu/libz.so.1 (0x000075bf7fef5000) libc.so.6 => /usr/lib/x86_64-linux-gnu/libc.so.6 (0x000075bf7f000000) /lib64/ld-linux-x86-64.so.2 (0x000075bf8008f000) libzstd.so.1 => /usr/lib/x86_64-linux-gnu/libzstd.so.1 (0x000075bf7f33d000)
Команда показала список библиотек, которые может использовать Angie, а также их пути в файловой системе. Для сравнения вывод этой же команды на бинарнике angie со статической компоновкой библиотеки OpenSSL:
ldd /usr/sbin/angie-401 linux-vdso.so.1 (0x000075f782b46000) libcrypt.so.1 => /usr/lib/x86_64-linux-gnu/libcrypt.so.1 (0x000075f782af4000) libm.so.6 => /usr/lib/x86_64-linux-gnu/libm.so.6 (0x000075f7829ce000) libpcre2-8.so.0 => /usr/lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x000075f781f54000) libz.so.1 => /usr/lib/x86_64-linux-gnu/libz.so.1 (0x000075f7829b0000) libc.so.6 => /usr/lib/x86_64-linux-gnu/libc.so.6 (0x000075f781c00000) /lib64/ld-linux-x86-64.so.2 (0x000075f782b48000)
В этом варианте нет библиотек libssl.so.3 и libcrypto.so.3 — они входят в сам исполняемый файл.
По аналогии с библиотеками в Angie есть возможность статической и динамической линковки модулей сервера. При динамической линковке модуль можно подгружать директивой load_module, при статической — он всегда загружен и его код включен в исполняемый файл Angie. Для модулей, которые поддерживают динамическую линковку используется параметр скрипта конфигурации со значением dynamic, например:
--with-http_image_filter_module=dynamic
Преимуществом динамической линковки является возможность переноса файла модуля (.so) на другие совместимые системы и дополнение функциональности Angie без полной пересборки сервера.
Возвращаемся к ошибке при конфигурации:
./configure: error: the HTTP rewrite module requires the PCRE library.
Самым простым решение будет установить пакет в этой библиоткой:
apt install libpcre2-dev
После этого на забудьте почистить (если используете) директорию angie‑feature‑cache. Однако, после удовлетворённой зависимости будет появляться новая ошибка об отсутствии библиотеки, пока вы не установите все необходимые. Процесс не самый быстрый: каждый раз нужно будет искать нужно имя пакета, чистить кэши и запускать скрипт конфигурации.
Есть более удобный способ установить зависимости (по крайней мере те, которые нужны для стандартной сборки). Для этого нужно подключить репозиторий пакетов с исходным кодом (в нашем случае deb‑src) помимо обычного репозитория Angie, файл /etc/apt/sources.list.d/angie.list примет такой вид:
deb https://download.angie.software/angie/ubuntu/26.04 resolute main deb-src https://download.angie.software/angie/ubuntu/26.04 resolute main
Теперь обновляем список пакетов и одной командой устанавливаем все зависимости для сборки:
apt update apt build-dep angie
После этого все библиотеки, необходимые для сборки пакета будут установлены. Конечно, если вы будете собирать дополнительные сторонние модули, могут появиться новые зависимости.
Итак, подготовка к сборке проведена, рассмотрим несколько реальных примеров сборки кастомных версий Angie.
Сборка с альтернативной версией TLS-библиотеки
Стандартные пакеты Angie из фирменного репозитория использует динамическую линковку для системной библиотеки OpenSSL. Самый простой способ собрать Angie c другой библиотекой: статическая линковка на OpenSSL. Нам потребуется скачать исходный код библиотеки с официального сайта (в примере используется OpenSSL 4.0.1) и распаковать в директорию рядом с исходниками Angie. Учитывайте, что текущая версия Angie может быть несовместима с выбранной вами версией OpenSSL. Сообщения о работе над совместимостью с OpenSSL обычно публикуются в списке изменений сервера.
wget https://github.com/openssl/openssl/releases/download/openssl-4.0.1/openssl-4.0.1.tar.gz tar -xpf openssl-4.0.1.tar.gz
Для статической линковки достаточно добавить для скрипта configure параметр ‑-with‑openssl=path с путём к исходниками OpenSSL.
Если скрипт configure выполнен успешно, запускаем сборку (параметр ‑j указывает количество потоков для утилизации нескольких процессоров):
make -j4
Результат сборки будет в директории ./objs, в том числе сам исполняемый файл angie.
Более сложный сценарий для использования одного из форков OpenSSL — AWS‑LC. Процесс сборки начинается с подготовки и сборки самой библиотеки, а затем она указывается в скрипте конфигурации. Будем использовать версию AWS‑LC 5.0.0 из официального github‑репозитория:
wget https://github.com/aws/aws-lc/archive/refs/tags/v5.0.0.tar.gz tar -xpf v5.0.0.tar.gz
Устанавливаем инструменты для сборки библиотеки:
apt install golang-go cmake ninja-build
Переходим в каталог с библиотекой и собираем её:
cd aws-lc-5.0.0/ cmake -GNinja -B build -DCMAKE_BUILD_TYPE=Release ninja -C build
После успешной сборки возвращаемся в каталог с исходниками Angie и добавляем следующие параметры скрипта configure.
--with-cc-opt='-fPIC -I ../aws-lc-5.0.0/include' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -Wl,-rpath -L ../aws-lc-5.0.0/build/ssl -L ../aws-lc-5.0.0/build/crypto -lssl -lcrypto -lstdc++'
Обратите внимание, что опция ‑-with‑openssl здесь не используется. Вместо неё мы указываем параметры компилятора (‑-with‑cc‑opt) и линковщика (‑-with‑ld‑opt), в которых содержатся пути поиска библиотеки AWS‑LC.
После сборки (make) проверяем исполняемый файл:
./objs/angie -V Angie version: Angie/1.11.7 nginx version: nginx/1.29.3 built on Thu, 18 Jun 2026 12:59:32 GMT built by gcc 15.2.0 (Ubuntu 15.2.0-16ubuntu1) built with OpenSSL 1.1.1 (compatible; AWS-LC 5.0.0) (running with AWS-LC 5.0.0)
Использование библиотеки AWS‑LC отражено в выводе команды.
Сборка Angie со сторонним модулем
Для примера сборки стороннего модуля будем использовать проект ngx_brotli — модули для поддержки Brotli-компрессии. Процесс сборки похож на пример с библиотекой AWS-LC.
Получаем исходный код модуля и собираем нужные компоненты по инструкции из README.md:
git clone --recurse-submodules -j8 https://github.com/google/ngx_brotli cd ngx_brotli/deps/brotli mkdir out && cd out cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DCMAKE_C_FLAGS="-Ofast -m64 -march=native -mtune=native -flto -funroll-loops -ffunction-sections -fdata-sections -Wl,--gc-sections" -DCMAKE_CXX_FLAGS="-Ofast -m64 -march=native -mtune=native -flto -funroll-loops -ffunction-sections -fdata-sections -Wl,--gc-sections" -DCMAKE_INSTALL_PREFIX=./installed .. cmake --build . --config Release --target brotlienc cd ../../../..
Теперь добавляем параметр для скрипта конфигурации: --add-module=../ngx_brotli. Такой вариант соответствует статической линковке модуля. Для динамической линковки используем параметр --add-dynamic-module=../ngx_brotli. После успешного выполнения скрипта конфигурации запускаем сборку (make).
Если сборка успешно завершена, пора переходить к установке.
Установка результатов сборки и сборка пакетов
Управление программным обеспечением, собранном из исходных кодов, не самое приятное занятие. После установки файлов (копирования в различные директории файловой системы) в системе не остаётся системной информации о версии софта, всех его файлах и других метаданных, содержащихся в пакете. Обновление и удаление значительно усложняется.
Тем не менее, базовую установку Angie после компиляции можно выполнить одной командой:
make install
Нужно учитывать, что в версии, собранной из исходных кодов не будет некоторых привычных элементов пакета. Например, юнит systemd для сервиса нужно будет создать вручную. Одним из вариантом может быть установка Angie из пакета и далее установка кастомной версии поверх. При этом нужно зафиксировать версию пакета с Angie, чтобы не затереть кастомную установку:
apt-mark hold angie
Второй вариант установки задействует утилиту checkinstall. По сути она выполняет те же действия, что и make install, но при этом упаковывает файлы в .deb‑пакет, который можно установить на другой системе.
checkinstall --pkgname=angie-custom --pkgversion=1.11.8 --nodoc
Такой вариант позволяет получить в результате пакет, но он всё ещё будет неполноценным. Установка полученного пакета также может производиться поверх обычного пакета Angie с последующей фиксацией версии.
Чтобы получить полноценный независимый пакет можно использовать пакет с исходниками Angie (из репозитория deb‑src), модифицировать его конфигурацию и собрать штатными средствами. Важно учитывать, что вместе со штатным пакетом Angie собирается большое количество сторонних модулей.
Подготовка: скачиваем пакеты с исходниками и устанавливаем зависимости:
apt source angie apt build-dep angie
Модифицируем параметры конфигурации в файле ./debian/rules.
Запускаем сборку пакета:
dpkg-buildpackage -b
Такой подход более корректен, так как мы получаем самостоятельный набор пакетов со всеми необходимыми компонентами.
Итоги
В этой статье мы разобрали некоторые аспекты сборки сервера Angie из исходных кодов. Процесс не самый простой, но в некоторых случаях нет другого выбора. С другой стороны, умение сборки Angie открывает широкое поле для экспериментов. Команды и параметры приведены для актуальных на момент написания версий софта. Они могут измениться в будущем. Над совместимостью различных компонентов работает команда разработчиков, следите за списком изменений.
kulaginds
А еще можно указать ссылку на первоисточник, в начале которого есть список всех зависимостей и несколько вариантов configure под разные кейсы использования.
Nickmob Автор
Такая ссылка в статье уже есть, но списка всех зависимостей там нет, указаны только минимальные зависимости.