LINUX.ORG.RU

Собрать установочный пакет

 , ,


0

2

Всем доброго времени суток.

Встала задача обновить nginx на группе серверов, нужно добавить модуль и openssl обновить. На тестовом сервере, скачав исходники, всё собрал, ошибки при сборке победил и всё завелось. Результат достигнут. Путем исследования интернета набрел в одной статье на хабре, что можно собрать, в моём случае, .rpm пакет из исходников.

Установил checkinstall, использовал сие статью. Далее, как я понял, что всё довольно тривиально:

./configure --prefix=/etc/nginx .....

make

checkinstall --install=no

Получил на выходе nginx-1.12.0-1.x86_64.rpm и довольный сделал откат тестовой на тот момент когда еще не надругался над ней своими манипуляциями.

Теперю же пытаюсь установить.

rpm -Uvh /tmp/111/nginx-1.12.0-1.x86_64.rpm 
Подготовка...     ########################################### [100%]

Казалось бы, что всё хорошо. Но, нет. nginx, как служба, перестал существовать.

/etc/nginx/*файлики на месте
/usr/sbin/nginx на месте
/etc/init.d/nginx благополучно испарился

Собственно, подскажите, я как-то не так собрал установочный пакет или же как-то не так его ставлю?

Проще и лучше взять .src.rpm из http://nginx.org/packages/centos/6/SRPMS/ (в нем точно есть инитскрипт) и перебрать с нужными опциями по инструкции (с заменой dnf на yum). А перед этим посмотреть, не лежит ли nginx, собранный так, как тебе хочется, в http://nginx.org/packages/centos/6/x86_64/.

dexpl ★★★★★ ()
Последнее исправление: dexpl (всего исправлений: 1)
Ответ на: комментарий от dexpl

Подскажите, пожалуйста, пошел правда по другой инструкции. Дошёл до редактирования nginx.spec и столкнулся с двумя проблемами: в какой части файла я должен указать нужные мне модули nginx и при запуске команды rpmbuild -ba nginx.spec получаю:

sh: lsb_release: команда не найдена
ошибка: /home/builder/rpmbuild/SPECS/nginx.spec:28: bad %if condition

И, еще такой вопрос. Так как у нас сервер на Centos 6, то файл /etc/yum.repos.d/nginx.repo у меня получается будет выглядеть так?

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1

[nginx-source]
name=nginx source repo
baseurl=http://nginx.org/packages/centos/6/SRPMS/
gpgcheck=1
enabled=0
gpgkey=http://nginx.org/packages/keys/nginx_signing.key
hanharr ()
Ответ на: комментарий от Jopich1

Спасибо, а в какой части nginx.spec нужно указывать с какими модулями я хочу собрать nginx?

...
--with-mail_ssl_module
--with-debug
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector
--param=ssp-buffer-size=4 -m64 -mtune=generic'
--with-ld-opt=-Wl,-E
--with-http_v2_module
--with-openssl=/tmp/openssl-1.0.2m
...
hanharr ()
Ответ на: комментарий от Jopich1

В этом блоке?

%define BASE_CONFIGURE_ARGS $(echo "--prefix=%{_sysconfdir}/nginx --sbin-path=%{_sbindir}/nginx --modules-path=%{_libdir}/nginx/modules --conf-path=%{_sysconfdir}/nginx/nginx.conf --error-log-path=%{_localstatedir}/log/nginx/error.log --http-log-path=%{_localstatedir}/log/nginx/access.log --pid-path=%{_localstatedir}/run/nginx.pid --lock-path=%{_localstatedir}/run/nginx.lock --http-client-body-temp-path=%{_localstatedir}/cache/nginx/client_temp --http-proxy-temp-path=%{_localstatedir}/cache/nginx/proxy_temp --http-fastcgi-temp-path=%{_localstatedir}/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=%{_localstatedir}/cache/nginx/uwsgi_temp --http-scgi-temp-path=%{_localstatedir}/cache/nginx/scgi_temp --user=%{nginx_user} --group=%{nginx_group} --with-compat --with-file-aio --with-threads --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-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module")
hanharr ()
Ответ на: комментарий от hanharr

если ты хочешь использовать встроенный модуль то тебе достаточно добавить опцию в configure да в указанном тобой блоке.

если это внешний модуль то в spec еще нужно добавить отделбный source модуля и обеспечить чтобы этот source распаковался ( смотри по аналогии с другими source ).

Jopich1 ()
Ответ на: комментарий от Jopich1

точнее сделать новую переменную например ADD_EXT_MODULES="-with-you-module-name" и потом эту переменную добавить туда где используется BASE_CONFIGURE_ARGS - так будет более красиво

Jopich1 ()
Ответ на: комментарий от Jopich1

В spec файл можно фактически писать то же самое что и ты пишешь в sh/bash. То что начинается с % - это макросы стандартные они описаны в /etc директории. Лучше ими пользоваться.

Например макрос %setup распаковывает указанный source в каталог с исходниками

Jopich1 ()
Ответ на: комментарий от Jopich1

Т.е. если я хочу докинуть еще openssl, то для него нужно будет добавить новую переменную? Вроде других внешних модулей у меня нет. Я на тестовом сервере установил nginx с «необходимыми» пакетами. Собранный nginx выглядит так:

configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/var/run/nginx.pid --lock-path=/var/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module --with-http_perl_module --with-mail --with-mail_ssl_module --with-debug --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --with-ld-opt=-Wl,-E --with-http_v2_module --with-openssl=/tmp/openssl-1.0.2m
hanharr ()
Ответ на: комментарий от Jopich1

Хм, спасибо. Попробую. Подскажите, а полученными пакетами я ведь смогу обновить уже установленный на сервере nginx. Просто задача была обновить nginx с добавлением модуля http2, и обновить openssl, который использует nginx. На тестовом сервера я собрал из исходников и сделал make install. Но, таких серверов еще 3. Поэтому, я подумал, что «мудрее» будет сделать rpm пакеты и ими обновить, а не играться исходниками на каждом серваке.

hanharr ()
Ответ на: комментарий от Jopich1

Поправил nginx.spec, добавив туда модули, с которыми уже собран и получил ошибку сборки пакетов.

Проверка на неупакованный(е) файл(ы): /usr/lib/rpm/check-files /home/builder/rpmbuild/BUILDROOT/nginx-1.12.2-1.el7_4.ngx.x86_64
ошибка: Обнаружен(ы) установленный(е) (но не упакованный(е)) файл(ы):
   /usr/lib64/perl5/perllocal.pod
   /usr/lib64/perl5/vendor_perl/auto/nginx/.packlist
   /usr/lib64/perl5/vendor_perl/auto/nginx/nginx.bs
   /usr/lib64/perl5/vendor_perl/auto/nginx/nginx.so
   /usr/lib64/perl5/vendor_perl/nginx.pm
   /usr/share/man/man3/nginx.3pm.gz


Ошибки сборки пакетов:
    Обнаружен(ы) установленный(е) (но не упакованный(е)) файл(ы):
   /usr/lib64/perl5/perllocal.pod
   /usr/lib64/perl5/vendor_perl/auto/nginx/.packlist
   /usr/lib64/perl5/vendor_perl/auto/nginx/nginx.bs
   /usr/lib64/perl5/vendor_perl/auto/nginx/nginx.so
   /usr/lib64/perl5/vendor_perl/nginx.pm
   /usr/share/man/man3/nginx.3pm.gz

Кусок из nginx.spec

%define main_version 1.12.2
%define main_release 1%{?dist}.ngx

%define bdir %{_builddir}/%{name}-%{main_version}

%define WITH_CC_OPT $(echo %{optflags} $(pcre-config --cflags)) -fPIC
%define WITH_LD_OPT -Wl,-z,relro -Wl,-z,now -pie

%define BASE_CONFIGURE_ARGS $(echo "--prefix=%{_sysconfdir}/nginx --sbin-path=%{_sbindir}/nginx --modules-path=%{_libdir}/nginx/modules --conf-path=%{_sysconfdir}/nginx/nginx.conf --error-log-path=%{_localstatedir}/log/nginx/error.log --http-log-path=%{_localstatedir}/log/nginx/access.log --pid-path=%{_localstatedir}/run/nginx.pid --lock-path=%{_localstatedir}/run/nginx.lock --http-client-body-temp-path=%{_localstatedir}/cache/nginx/client_temp --http-proxy-temp-path=%{_localstatedir}/cache/nginx/proxy_temp --http-fastcgi-temp-path=%{_localstatedir}/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=%{_localstatedir}/cache/nginx/uwsgi_temp --http-scgi-temp-path=%{_localstatedir}/cache/nginx/scgi_temp --user=%{nginx_user} --group=%{nginx_group} --with-compat --with-file-aio --with-ipv6 --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module --with-http_perl_module --with-mail --with-mail_ssl_module")

Подскажите по таком вопросу еще, ниже приведу вывод nginx -V там указаны пути для лог файлов, например, а в nginx.spec это переменные. Если я хочу получить 1 в 1, то нужно указать прям как в выводе или это как-то иначе делается?

nginx -V

nginx version: nginx/1.12.0
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) 
built with OpenSSL 1.0.2m  2 Nov 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/var/run/nginx.pid --lock-path=/var/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module --with-http_perl_module --with-mail --with-mail_ssl_module --with-debug --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --with-ld-opt=-Wl,-E --with-http_v2_module --with-openssl=/tmp/openssl-1.0.2m
hanharr ()
Ответ на: комментарий от hanharr

не то показал - это ошибка возникает в разделе %files. добавь туда строчки

%dir /usr/lib64/perl5/*
%dir /usr/share/man/*

( ну или по аналогии - там может быть вместь /usr/lib64 имена переменных например )

получить 1 в 1, то нужно указать прям как в выводе или это как-то иначе делается?

--error-log-path ?

Это переменные для опции configure. Насчет того то нужно ли указывать зависит как у тебя настроен nginx. Если там не указываются явно пути ( что есть дурной тон ) - то да, иначе может после обновления не заработать

Jopich1 ()
Ответ на: комментарий от Jopich1

Вроде как получилось, наполовину

Нашёл статью на wiki и исходя из неё дописал директории. Вышло так. Немного отличается от того, что описали вы, так и должно быть?

%files
%defattr(-,root,root)

%{_sbindir}/nginx
%{_sbindir}/nginx-debug

%{_libdir}/perl5/
%{_mandir}/*

%dir %{_sysconfdir}/nginx
%dir %{_sysconfdir}/nginx/conf.d
%{_sysconfdir}/nginx/modules
...

По окончании rpmbuild -ba nginx.spec Получил следующий вывод. Выглядит, будто бы всё хорошо. :)

...
Проверка на неупакованный(е) файл(ы): /usr/lib/rpm/check-files /home/builder/rpmbuild/BUILDROOT/nginx-1.12.2-1.el7_4.ngx.x86_64
Записан: /home/builder/rpmbuild/SRPMS/nginx-1.12.2-1.el7_4.ngx.src.rpm
Записан: /home/builder/rpmbuild/RPMS/x86_64/nginx-1.12.2-1.el7_4.ngx.x86_64.rpm
Записан: /home/builder/rpmbuild/RPMS/x86_64/nginx-debuginfo-1.12.2-1.el7_4.ngx.x86_64.rpm
Выполняется(%clean): /bin/sh -e /var/tmp/rpm-tmp.gBrT0Y
+ umask 022
+ cd /home/builder/rpmbuild/BUILD
+ cd nginx-1.12.2
+ /usr/bin/rm -rf /home/builder/rpmbuild/BUILDROOT/nginx-1.12.2-1.el7_4.ngx.x86_64
+ exit 0

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

hanharr ()