Сборка RPM-пакета на примере Nginx

Сборка RPM-пакета на примере Nginx

26.01.2023
Автор: HostZealot Team
2 мин.
1189

RPM – пакетный менеджер, который используется в операционных системах Linux на базе Red Hat. Хранение данных в формате RPM осуществляется с помощью архивного контейнера cpio, который сжимает данные с помощью утилиты gzip, bzip2, LZMA, XZ или XAR, в зависимости от версии. Название каждого RPM пакета включает 4 элемента:

  • название программы;
  • версия;
  • номерное обозначение версии;
  • указание архитектуры, под которую пакет собирался.

Далее в статье мы расскажем, как собрать собственный RPM пакет для CentOS на примере Nginx с модулем SPNEGO. Двигаться к этой цели будем в несколько этапов: от создания простейшего пакета до добавления в него отдельных модулей с редактированием конфигурационного файла.

Предварительная настройка операционной системы CentOS

Первым делом нужно установить несколько важных пакетов:

yum install wget rpm-build rpmdevtools gcc make


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

Далее нужно установить зависимости:

yum install openssl-devel zlib-devel pcre-devel


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

Последний шаг предварительной настройки операционной системы – создание отдельного пользователя. Делать это от имени пользователя с правами доступа уровня root не стоит, так как любая ошибка при указании путей может привести к тому, что какие-то файлы или даже целые директории будут потеряны. Итак, выполните команду:

useradd creator -m


Таким образом мы создали пользователя creator и отдельный домашний каталог для него. Чтобы все дальнейшие действия будем совершать от его имени, пропишите:

su - creator

Настройка окружения пользователя

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

Чтобы удостовериться, что находитесь в нужной директории, пропишите команду:

$ pwd


Если консоль выдаст вам сообщение «/home/creator», вы в правильном месте. Если видите что-то другое, просто перейдите в домашний каталог с помощью команды:

$ cd ~


И затем создайте структуру каталогов для сборки:

$ rpmdev-setuptree


Теперь в нашем домашнем каталоге пользователя creator появится папка rpmbuild, содержащая такую структуру:

  • BUILD — здесь расположены файлы, появляющиеся в процессе создания RPM-пакета.
  • RPMS — здесь будут лежать готовые пакеты.
  • SOURCES — содержит исходники для сборки RPM-пакетов.
  • SPECS — здесь содержатся файлы с описанием сборки.
  • SRPMS — содержит исходники RPM-файлов.

Теперь мы с вами готовы к загрузке исходника и его подготовке к дальнейшим процессам.

Создание RPM пакетов из исходников

Перейдите на страничку загрузки пакетов Nginx и выберите те из них, которые нужны конкретно для вашей операционной системы. Мы собираем RPM на базе CentOS 7. Если вы тоже – можете сразу же перейти в соответствующий раздел. Здесь вы найдете исходники для конкретной версии ОС. Копируйте ссылку и далее загрузите исходник через консоль:

$ wget https://nginx.org/packages/mainline/centos/7/SRPMS/nginx-1.19.3-1.el7.ngx.src.rpm


И теперь устанавливаем исходник с помощью команды:

$ rpm -Uvh nginx-1.19.3-1.el7.ngx.src.rpm


После этого в каталоге rpmbuild/SOURCES вы сможете увидеть появившиеся исходные файлы для сборки RPM с нужной для вас версией веб-сервера Nginx.

Переходим к созданию сборки установочного RPM-пакета:

$ rpmbuild -bb rpmbuild/SPECS/nginx.spec


Результатом станет появление пакета в каталоге rpmbuild/RPMS/x86_64, который содержит два файла:

  • nginx-1.19.3-1.el7.ngx.x86_64.rpm: установочный пакет.
  • nginx-debuginfo-1.19.3-1.el7.ngx.x86_64.rpm: установочный пакет со сведениями для отладки.

Теперь мы готовы к установке.

Сборка rpm-пакета на примере nginx

Основные операции с установочным пакетом

Чтобы установить собранный пакет, пишем команду:

rpm -Uvh <путь к собранному пакету>


Ключи -Uvh обеспечивают последовательное обновление, вывод сведений о ходе установке и демонстрацию статуса. Во время инициирования команды вы должны быть расположены в каталоге, в котором размещен пакет RPM.

Далее, чтобы запустить Nginx, прописываем поочередно команды:

systemctl enable nginx
systemctl start nginx


Первая команда нужна для автоматического запуска веб-сервера, вторая же инициирует его запуск здесь и сейчас.

Если нужно будет удалить пакет, также потребуется ввести две команды:

systemctl disable nginx
systemctl stop nginx


Чтобы получить информацию о полном названии установленного в вашей ОС пакета, пропишите такую команду:

rpm -qa | grep nginx


После остановки веб-сервера удалить пакет можно командой:

rpm -e nginx-1.19.3-1.el7.ngx.x86_64

Как добавить модуль SPNEGO?

Добавить модуль SPNEGO в сборку легко. Последовательно введите ряд команд:

yum install git
su - creator
$ cd ~
$ git clone https://github.com/stnoonan/spnego-http-auth-nginx-module.git /tmp/spnego-http-auth-nginx-module
$ vi rpmbuild/SPECS/nginx.spec


Перед вами откроется файл nginx.spec, в котором нужно:

  • Найти строку «%define BASE_CONFIGURE_ARGS ...».
  • После --with-... добавить --add-dynamic-module=/tmp/spnego-http-auth-nginx-module.

Теперь найдите %description и после него добавьте:

%package module-spnego
Group: %{_group}
Requires: nginx = %{?epoch:%{epoch}:}%{main_version}-%{main_release}
Summary: nginx spnego module
%description module-spnego
Dynamic Spnego module for nginx.


Далее находим %build и добавляем:

echo 'load_module "%{_libdir}/nginx/modules/ngx_http_auth_spnego_module.so";' \
	> %{buildroot}%{_sysconfdir}/nginx/modules/spnego-http-auth-nginx-module.conf


И последнее – находим %files и добавляем:

%files module-spnego
%{_libdir}/nginx/modules/spnego-http-auth-nginx-module.conf
%{_libdir}/nginx/modules/ngx_http_auth_spnego_module.so


Теперь, чтобы запустить сборку, вводим команду:

$ rpmbuild -bb rpmbuild/SPECS/nginx.spec


Чтобы установить сборку, нам потребуются два RPM-пакета:

  • nginx-1.19.3-1.el7.ngx.x86_64.rpm
  • nginx-module-spnego-1.19.3-1.el7.ngx.x86_64.rpm

Оба они расположены в каталоге RPMS.

Когда установка будет завершена, выполните команду:

nginx -V


Отыщите опцию ... --add-dynamic-module=/tmp/spnego-http-auth-nginx-module ... – это и есть опция вашей сборки.

Чтобы модули подгружались, отредактируем конфиг Nginx:

vi /etc/nginx/nginx.conf


В корень необходимо добавить такой текст:

user  nginx;
worker_processes  1;
 
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
 
include /etc/nginx/modules/*.conf;
 
events {

...

Настройка конфигурации NGINX

Далее расскажем, как сделать подпись пакета и проверить её, чтобы можно было гарантировать авторство сборки. Для создания подписи прописываем несколько команд от имени пользователя с правами доступа уровня root:

# yum install rpm-sign pinentry


Далее переключаемся на пользователя creator, которого мы создали ранее, и генерируем ключ:

$ gpg2 --gen-key


Перед вами появится запрос, на который нужно ответить «4» – это будет значить, что RSA ключ только для подписи. Размер ключа оставляйте по умолчанию, а вот период актуальности ключа установите уже на свое усмотрение.

Подтвердить корректность данных можно стандартным «y».

Теперь нужно ввести данные ключа. Например, так:

Real name: Volt
Email address: rpm@volt.com
Comment:


Корректность данных подтверждается ключом «O». После этого дважды введите пароль.

В конце концов откройте вторую версию SSH и введите последовательно три команды:

dd if=/dev/sda of=/dev/zero
$ gpg -K
$ vi ~/.rpmmacros


Добавьте в этот файл следующие строки:

%_signature gpg
%_gpg_name Volt
%_gpgbin /usr/bin/gpg2
%__gpg_sign_cmd %{__gpg} gpg --force-v3-sigs --batch --verbose --no-armor --no-secmem-warning -u "%{_gpg_name}" -sbo %{__signature_filename} --digest-algo sha256 %{__plaintext_filename}'


Остается лишь подписать пакет:

$ rpm --addsign rpmbuild/RPMS/x86_64/nginx-1.19.3-1.el7.ngx.x86_64.rpm


Подтвердите действие с помощью пароля.

Проверка подписи RPM-пакета

Для проверки подписи сперва экспортируйте public key:

gpg2 -a --export Volt > RPM-GPG-KEY-Volt


После этого вы получите ключ RPM-GPG-KEY-Volt, его нужно перенести на целевой ПК, где и выполнить проверку подписи. Импортируем ключ от имени пользователя с правами root:

rpm --import RPM-GPG-KEY-Volt


И проверяем подпись:

rpm --checksig nginx-1.19.3-1.el7.ngx.x86_64.rpm


В результате вы увидите перед собой сообщение, похожее на это:

nginx-1.19.3-1.el7.ngx.x86_64.rpm: digests signatures OK


Надеемся, наша статья помогла вам разобраться, как собрать RPM-пакет на примере Nginx. Если возникнут сложности, обращайтесь к специалистам HostZealot. Всего доброго!

# Как сделать Поделиться:
Статьи по Теме