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

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

09:48, 26.01.2023

Содержание статьи
arrow

  • Предварительная настройка операционной системы CentOS
  • Настройка окружения пользователя
  • Создание RPM пакетов из исходников
  • Основные операции с установочным пакетом
  • Как добавить модуль SPNEGO?
  • Настройка конфигурации NGINX
  • Проверка подписи RPM-пакета

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. Всего доброго!

views 2m, 3s
views 2
Поделиться

Была ли эта статья полезной для вас?

Популярные предложения VPS

Другие статьи на эту тему

cookie

Принять файлы cookie и политику конфиденциальности?

Мы используем файлы cookie, чтобы обеспечить вам наилучший опыт работы на нашем сайте. Если вы продолжите работу без изменения настроек, мы будем считать, что вы согласны получать все файлы cookie на сайте HostZealot.