Создание устанавливаемых пакетов для динамических модулей

nginx

NGINX 1.11.5 и NGINX Plus R11 представили поддержку компиляции динамических модулей независимо от самого NGINX. Это позволяет использовать официальные сборки репозиториев NGINX, Inc. и загружать их в динамические модули. Существует несколько источников динамических модулей:

  • официальный репозиторий готовых пакетов и модулей NGINX с открытым исходным кодом;
  • официальный репозиторий пакетов и модулей NGINX Plus;
  • сертифицированные модули NGINX Plus;
  • сторонние модули.

В этой статье мы расскажем об использовании сторонних динамических модулей NGINX и NGINX Plus.

Трудности с файлами в формате .so

При компиляции динамического модуля необработанный вывод (the raw output) является выделенным объектом (.so-файл). При запуске и перезагрузке NGINX и NGINX Plus загружаются каждый из выделенных объектов, указанных в директиве load_module. Они обычно размещаются в/etc/nginx/modules.

Динамические модули совместимы с бинарными версиями официальных версий NGINX и NGINX Plus. Однако эта бинарная совместимость имеет ограничения. Динамические модули должны быть скомпилированы в той же версии NGINX, в которую они загружены. Для NGINX Plus динамические модули должны быть скомпилированы в противовес версии с открытым исходным кодом, на которой базируется NGINX Plus. Из-за обновлений NGINX или NGINX Plus без предварительной установки новой версии динамического модуля могут возникнуть проблемы при установке.

Ручное управление зависимостью между NGINX и его динамическими модулями приводит к ошибкам. В динамических файлах с расширением .so не указано, в какой версии NGINX они были созданы, что делает процесс ручного копирования ненадежным. В среде разработки это, как правило, приемлемо, но в производственной среде зависимости необходимо защищать и автоматизировать автоматизацию.

Пакеты динамических модулей с зависимостями

В официальных репозиториях NGINX или NGINX Plus используется менеджер пакетов для установки и обновления NGINX – yum для Red Hat/CentOS и apt для Ubuntu/Debian. Официальные репозитории NGINX и NGINX Plus также содержат устанавливаемые пакеты для ряда динамических модулей. Метаданные пакета динамического модуля указывают версию NGINX, с которой был скомпилирован модуль, автоматически запуская обновление модуля во время обновления NGINX или NGINX Plus.

Использование устанавливаемых пакетов для сторонних динамических модулей предусматривает соблюдение зависимости от NGINX, предотвращает сбои при обновлении.

NGINX, Inc применяет автоматизированные утилиты для пакетов динамических модулей в официальных репозиториях. Эта программа называется pkg-oss и может использоваться при создании устанавливаемых пакетов для сторонних динамических модулей.

Pkg-oss подходит для создания устанавливаемого пакета любого динамического модуля.  Утилита включает скрипт build_module.sh, который автоматизирует процессы установки, например, создание устанавливаемого пакета с правильной зависимостью от NGINX или NGINX Plus. Необходимо просто указать версию NGINX или NGINX Plus и расположение источников динамического модуля. Источники модулей могут находиться на локальном диске, на репозитории GitHub или храниться в формате общей ссылки для загрузки. В примере, показанном ниже, создается модуль RTMP для NGINX Plus R11 на Ubuntu/Debian.

$ wget ttp://hg.nginx.org/pkg-oss/raw-file/tip/build_module.sh

$ chmod a+x build_module.sh

$ ./build_module.sh -r 11 https://github.com/arut/nginx-rtmp-module.git

build_module.sh: INFO: Module packages created

~/debuild/nginx-plus-module-rtmp_1.11.5_amd64.deb

~/debuild/nginx-plus-module-rtmp-dbg_1.11.5_amd64.deb

Имя файла указывает на то, что модуль был создан в противовес базовой версии NGINX для NGINX Plus R11 (1.11.5). Это можно подтвердить путем изучения метаданных.

$ dpkg-deb -f ~/debuild/nginx-plus-module-rtmp_1.11.5_amd64.deb Depends

libc6 (>= 2.14), nginx-plus (>> 1.11.4), nginx-plus (<< 1.11.6)

На что нужно обратить внимание при использовании скрипта build_module.sh.

Запуск сценария в среде сборки

В производственной среде лучше всего установить программное обеспечение, которое не включает инструменты, необходимые для компиляции и упаковки динамических модулей. Рекомендуется запускать скрипт build_module.sh в отдельной среде сборки, но на той же платформе, что и в производственной среде.

Скрипт не работает для каждого модуля

Скрипт успешно протестирован на большинстве сторонних модулей, доступных для NGINX. Он даже пытается обновить статические модули до динамических «на лету». Тем не менее, некоторые модули имеют дополнительные зависимости времени компиляции, которые сценарий не может предсказать, или их необходимо объединить вместе с другими компонентами программного обеспечения.

Сценарий создает устанавливаемые пакеты для внутреннего использования. Пакет распространяется без авторских прав, лицензий или документации. Если вы планируете перераспределять модуль как устанавливаемый пакет, можно использовать инструмент pkg-oss для определения настраиваемого пакета.

Для обновления требуется репозиторий yum или apt

Сценарий обеспечивает удобный способ создания устанавливаемых пакетов для динамических модулей, но он не обеспечивает реконфигурацию автоматически, если пакет не установлен из репозитория yum или apt.

Настройка приватного репозитория для реконфигурации

Многие компании используют приватные репозитории для распространения программного обеспечения. После копирования файлов .deb/.rpm, созданных инструментами NGINX pkg-oss, в репозитории есть возможность удалять и обновлять динамические модули с помощью менеджера пакетов, который используется для установки NGINX и NGINX Plus. Если приватного репозитория нет, его можно создать на локальном сервере таким образом.

Чтобы проиллюстрировать этот процесс, мы покажем, как создать приватный репозиторий для Ubuntu/Debian и Red Hat/CentOS, чтобы наш динамический модуль можно было установить с помощью apt (8) или yum (8). Для выполнения этих шагов требуется root-доступ. Кроме того, мы пропустили командную строку в этом разделе, чтобы облегчить копирование и вставку.

  1. Подготовка зависимости и создание локального репозитория для менеджера пакетов.

В системах Ubuntu/Debian:

mkdir /opt/deb

echo “deb file:/opt deb/” > /etc/apt/sources.list.d/local.list

В системах Red Hat/CentOS:

yum install createrepo

mkdir /opt/rpm

cat << EOF > /etc/yum.repos.d/localrepo.repo

[localrepo]

name=Dynamic modules for NGINX

baseurl=file:///opt/rpm

gpgcheck=0

enabled=1

EOF

  1. Копирование устанавливаемого пакета для динамического модуля в локальный репозиторий.

В системах Ubuntu/Debian:

cp ~/debuild/nginx-plus-module-rtmp_1.11.5_amd64.deb /opt/deb

В системах Red Hat/CentOS:

cp ~/rpmbuild/RPMS/x86_64/nginx-plus-module-rtmp-1.11.5-1.el7.centos.ngx.x86_64.rpm /opt/rpm

  1. Обновление диспетчера пакетов для получения информации о пакете динамического модуля.

В системах Ubuntu/Debian:

cd /opt && dpkg-scanpackages deb | gzip > deb/Packages.gz

apt-get update

В системах Red Hat/CentOS:

createrepo -v /opt/rpm

yum clean all

yum update

  1. Повторение второго и третьего пункта для каждого модуля.

Установка модуля из приватного репозитория

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

В системах Ubuntu/Debian:

$ apt-get install nginx-plus-module-rtmp

В системах Red Hat/CentOS:

$ yum install nginx-plus-module-rtmp

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

По завершении установки появляется сообщение о том, как настроить NGINX для загрузки недавно установленного динамического модуля.

The rtmp dynamic module for nginx has been installed.

To enable this module, add the following to /etc/nginx/nginx.conf

and reload nginx:

   load_module modules/ngx_rtmp_module.so;

Реконфигурация динамического модуля NGINX

Установка динамического модуля этим способом позволит избежать несоответствия версий при обновлениях NGINX или NGINX Plus. Если обновление для NGINX или NGINX Plus выполняется до установки динамических модулей, локальный менеджер пакетов сообщает об этой проблеме.

В системах Ubuntu/Debian:

$ apt install nginx-plus

The following packages will be REMOVED

 nginx-plus-module-rtmp

The following packages will be upgraded:

 nginx-plus

Do you want to continue? [Y/n]

В системах Red Hat/CentOS:

$ yum install nginx-plus

Error: Package:‌ nginx-plus-module-rtmp-1.11.5-1.el7.centos.ngx.x86_64 (@localrepo)

Requires: nginx-plus = 1.11.5

Чтобы обеспечить реконфигурацию, сначала необходимо создать новую версию динамического модуля для версии NGINX или NGINX Plus, которую необходимо обновить. Ниже показаны шаги, которые нужно выполнить для обновления NGINX Plus с R11 по R12 с установленным динамическим модулем RTMP.

  1. Создание динамического модуля для NGINX Plus R12.

$ ./build_module.sh -r 12 https://github.com/arut/nginx-rtmp-module.git

build_module.sh: INFO: Module packages created

~/debuild/nginx-plus-module-rtmp_1.11.10_amd64.deb

~/debuild/nginx-plus-module-rtmp-dbg_1.11.10_amd64.deb

  1. Выполнение пунктов 2 и 3 из раздела «Настройка приватного репозитория для реконфигурации» для обновления приватного репозитория с помощью нового динамического модуля.
  2. Обновление NGINX Plus.

В системах Ubuntu/Debian:

$ apt-get install nginx-plus

Reading package lists… Done

Building dependency tree

Reading state information… Done

The following packages will be upgraded:

 nginx-plus nginx-plus-module-rtmp

2 to upgrade, 0 to newly install, 0 to remove

Need to get 2,571 kB/2,731 kB of archives.

After this operation, 411 kB of additional disk space will be used.

Do you want to continue? [Y/n]

On Red Hat/CentOS systems:

$ yum install nginx-plus

Resolving Dependencies

–> Running transaction check

—> Package nginx-plus.x86_64 0:1.11.5-1.el7.ngx will be updated

–> Processing Dependency:

—> Package nginx-plus-module-rtmp.x86_64 0:1.11.5-1.el7.centos.ngx will be updated

–> Finished Dependency Resolution

Dependencies Resolved

=========================================================================

Package                Arch   Version                  Repository  Size

=========================================================================

Updating:

nginx-plus             x86_64 1.11.10-3.el7.ngx        nginx-plus 2.4 M

Updating for dependencies:

nginx-plus-module-rtmp x86_64 1.11.10-1.el7.centos.ngx localrepo  176 k

Transaction Summary

=========================================================================

Upgrade  1 Package (+1 Dependent package)

Total download size: 2.6 M

Is this ok [y/d/N]:

Вместо вывода

Динамические модули для NGINX и NGINX Plus позволяют скомпилировать только те конкретные расширения, которые действительно необходимы, c использованием заранее подготовленных и проверенных пакетов от NGINX, Inc. Утилита pkg-oss и скрипт build_module.sh обеспечивают простое решение для создания, установки и обновления сторонних модулей при настройке NGINX и NGINX Plus.

Запишитесь на курс “Linux для DevOps” и вы будете знать намного больше, чем принципы создания устанавливаемых пакетов для динамических модулей!

Залишити відповідь

Дякуємо, що поділились