Thank you for reading this post, don't forget to subscribe!
Если нам нужно часто устанавливать свои пакеты, у нас может уходить много времени на их конфигурирование и сборку. Мы рассмотрим процесс того, как сделать RPM-пакет для установки на дистрибутив Linux одноименного семейства (например, CentOS или Red Hat). В качестве примера мы соберем NGINX с модулем SPNEGO. Это будет сделано поэтапно — сначала мы соберем простой пакет, потом добавим в него модуль и внесем изменения в конфигурационный файл.
Подготовка системы
1. Устанавливаем необходимые пакеты:
yum install wget rpm-build rpmdevtools
* где:
- wget — утилита для загрузки файлов по сети.
- rpm-build — включает в себя утилиту rpmbuild, с помощью которой будет выполняться сама сборка установочного пакета.
- rpmdevtools — позволит нам использовать утилиту rpmdev-setuptree, с помощью которой мы сможем создать рабочую среду в виде каталогов для сборки.
2. Устанавливаем зависимости:
yum install openssl-devel zlib-devel pcre-devel
* данные пакеты необходимы именно для нашего варианта сборки. Имейте ввиду, что в вашем случае может понадобиться больше зависимостей. Так или иначе, если в системе не будет хватать необходимых пакетов, мы получим ошибку при попытке выполнить сборку RPM.
3. Создаем пользователя.
Делать готовые установочные сборки пакетов очень опасно от пользователя root. Если мы допустим ошибку с путями, файлы могут перетереть или удалить важные для работы директории. Стоит создать отдельного пользователя и работать под ним.
Выполняем команду:
useradd builder -m
* в данном примере мы создадим пользователя builder. Опция -m сразу создаст домашний каталог для пользователя.
Теперь заходим под данным пользователем — последующие команды мы будем выполнять от него:
su - builder
Подготовка среды
Необходимо убедиться, что мы находимся в нужном каталоге для сборки — это может быть произвольная папка, которую мы создадим. В моем примере я буду использовать домашнюю директорию пользователя. Проверить текущее положение можно командой:
$ pwd
Мы должны увидеть что-то на подобие:
/home/builder
Перейти в домашний каталог пользователя можно командой:
$ cd ~
Создадим структуру каталогов для сборки:
$ rpmdev-setuptree
В нашей текущем каталоге должна появиться папка rpmbuild — а в ней:
- BUILD — содержит все файлы, которые появляются при создании пакета.
- RPMS — сюда будут складываться готовые пакеты.
- SOURCES — для исходников, из которых и будут собираться RPM-пакеты.
- SPECS — для файлов с описанием процесса сборки.
- SRPMS — для исходников RPM-файлов.
Мы готовы к загрузке исходника и его подготовке.
Загрузка исходника и сборка RPM
На странице загрузки пакетов NGINX мы можем найти пакеты для нужной нам операционной системы. Так как в нашем примере собирается пакет для CentOS (я выбрал 7), то можно перейти сразу в соответствующий каталог.
Находим исходник вида nginx-<версия>.<отметка версии linux>.ngx.src.rpm и копируем на него ссылку:
* в моем примере мне нужен nginx версии 1.19.3.
С помощью скопированной ссылки загружаем исходник:
$ 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 появятся исходники для сборки нужной нам версии NGINX.
Собираем установочный RPM-пакет:
$ rpmbuild -bb rpmbuild/SPECS/nginx.spec
В каталоге rpmbuild/RPMS, в зависимости от архитектуры пакета создастся каталог. В моем примере полный путь до созданного пакета — rpmbuild/RPMS/x86_64. В нем мы должны найти 2 файла:
- nginx-1.19.3-1.el7.ngx.x86_64.rpm: пакет для установки.
- nginx-debuginfo-1.19.3-1.el7.ngx.x86_64.rpm: пакет для установки с отладочной информацией.
Пакет создан и готов к установке.
Установка, запуск и удаление
1. Для установки собранного пакета вводим команду:
rpm -Uvh <путь до собранного пакета>
* где rpm вводится с ключами:
- U — обновить, если пакет уже установлен в системе.
- v — вывод информации о ходе процесса.
- h — показывать статус установки.
Список всех ключей можно посмотреть командой rpm --help или man rpm.
Для выполнения данной команды мы должны скопировать на необходимый компьютер наш собранный пакет и зайти в систему под пользователем с правами на установку (как правило, при повышении привилегий до root).
В нашем случае команда будет такой:
rpm -Uvh nginx-1.19.3-1.el7.ngx.x86_64.rpm
* при этом мы должны находиться в каталоге, в котором разместили пакет RPM.
2. Для запуска nginx вводим команды:
systemctl enable nginx
systemctl start nginx
* Первая команда позволит нашему веб-серверу запускаться автоматически. Вторая запустит сервис.
Для проверки состояния сервиса вводим команду:
systemctl status nginx
Я столкнулся с 2-я разными проблема при запуске сервиса.
1) служба не стартовала, выдавая ошибку. В логе говорилось, что нет доступа к файлу /var/run/nginx.pid. Повторный запуск службы решил проблемы.
2) система выдавала ошибку «Unit nginx.service could not be found», которая говорит, что сервиса nginx не существует. Проблема решается вводом команды systemctl daemon-reload, которая перечитываем конфигурационные файлы для systemd.
3. Чтобы удалить пакет сначала запретив автозапуск сервиса и остановим его:
systemctl disable nginx
systemctl stop nginx
Смотрим полное название установленного в системе пакета:
rpm -qa | grep nginx
В моем случае это было:
nginx-1.19.3-1.el7.ngx.x86_64
Для удаления пакета вводим:
rpm -e nginx-1.19.3-1.el7.ngx.x86_64
Добавление модуля
Как говорилось выше, мы добавим модуль SPNEGO в нашу сборку. Для примера, мы будем использовать динамическое подключение данного модуля.
В моем примере необходимо клонировать проект из GIT-репозитория. Для этого необходимо установить одноименную утилиту:
yum install git
Теперь заходим под ранее созданным пользователем builder:
su - builder
Переходим в каталог для сборки. В нашем случае, это домашняя директория:
$ cd ~
Клонируем исходник модуля в директорию /tmp:
$ git clone https://github.com/stnoonan/spnego-http-auth-nginx-module.git /tmp/spnego-http-auth-nginx-module
Ранее мы уже скачивали исходники nginx, поэтому сразу открываем файл nginx.spec:
$ vi rpmbuild/SPECS/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
Для установки нам понадобится 2 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
В корневой секции добавим:
1 2 3 4 5 6 7 8 9 10 |
user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; <strong>include /etc/nginx/modules/*.conf;</strong> events { ... |
Ниже по инструкции будет рассказано, как собрать пакет со своим конфигурационным файлом.
Изменение конфигурационного файла NGINX
Перед сборкой мы можем изменить конфигурационный файл веб-сервера, который уже попадет в наш установочный пакет. Так как мы рассматриваем пример работы с модулем spnego, внесем настройки для него.
Открываем файл:
$ vi rpmbuild/SOURCES/nginx.conf
Внесем следующие изменения:
1 2 3 4 5 6 7 8 9 10 |
user nginx; worker_processes auto; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; include /etc/nginx/modules/*.conf; events { ... |
* в нашем примере внесено всего 2 изменения:
- worker_processes, который отвечает за распределение нагрузки по ядрам уже давно рекомендуется выставлять в значение auto.
- Также мы дописали строку include /etc/nginx/modules/*.conf, которая укажет нашему веб-серверу подгружать все конфигурационные файлы из каталога modules.
Также активируем для сайта по умолчанию опцию для модуля spnego. Открываем файл:
$ vi rpmbuild/SOURCES/nginx.vh.default.conf
Это файл, который будет находиться по пути /etc/nginx/conf.d/default.conf. Внесем в него изменения:
1 2 3 4 5 6 7 8 9 |
location / { root /usr/share/nginx/html; index index.html index.htm; auth_gss on; auth_gss_realm test.RU; auth_gss_keytab /etc/http.keytab; auth_gss_service_name HTTP/test.test.ru; } |
Пересобираем RPM:
$ rpmbuild -bb rpmbuild/SPECS/nginx.spec
Выполняем установку новых пакетов на целевом сервере. В нашем примере мы можем переустановить пакеты командами:
rpm -Uvh --force nginx-1.19.3-1.el7.ngx.x86_64.rpm
rpm -Uvh --force nginx-module-spnego-1.19.3-1.el7.ngx.x86_64.rpm
* напоминаю, что у нас используется версия 1.19.3. Чтобы данные команды отработали, необходимо находиться в каталоге, где лежат наши установочные файлы.
Мы должны увидеть изменения в конфигах, которые сделали до сборки.