Ubuntu → Сборка deb пакета Nginx из исходных кодов с добавлением сторонних модулей

Мне в почту написал человек, с вопросом сборки Nginx из исходных кодов, который прочитал мою старую статью, его интересовала возможность добавления сторонних модулей, а т.к. в Nginx поддержка нужных модулей закладывается во время сборки, то тут все оказалось немного сложнее чем обычно, но ничего невыполнимого тут нет. Мы соберем deb пакет web-сервера Nginx с поддержкой модуля lua который сильно нужен, также мы добавим штатный модуль Nginx, который, по умолчанию, не собирается и удалим один модуль который идет по умолчанию, но не всем нужен. В общем, я постараюсь описать процесс быстрой сборки пакета, на примере Nginx, в котором есть только то что нужно нам и ничего лишнего.
Для работы нам понадобится система с Ubuntu, редакция ( decktop/server ) значения не имеет, единственное — если вы хотите собирать пакеты для архитектуры amd64, то на машину, которая будет осуществлять сборку, лучше ставить систему именно этой разрядности.
Как потом поступить с этим пакетом решать уже вам, можно положить в собственный репозиторий или устанавливать как есть.
В данный момент, самой свежей версией Nginx является 1.9.9 вот ее мы и будем собирать.
Для начала, обновим список пакетов
sudo apt-get update
Установим минимально-необходимый набор ПО, который необходим для сборки deb пакета, за одно установим git, чтобы можно было стянуть свежие исходники модуля
sudo apt-get install dh-make build-essential git
Создадим директорию в которой будем выполнять сборку, назовем ее build_dir
mkdir build_dir
переходим в директорию build_dir
cd build_dir
Скачаем исходники Nginx
wget http://nginx.org/download/nginx-1.9.9.tar.gz
А теперь сделаем «финт ушами», мы не будем писать файлы для сборки самостоятельно, возьмем уже из готового пакета и добавим в них то что нам необходимо. За всем этим добром отправляемся в репозиторий nginx. Это сильно сэкономит нам время, думаю часа 2-3 точно…
Нас интересует архив, название которого заканчивается на debian.tar.xz для версии 1.9.9 мы возьмем файл, из названия становится ясно, что он рассчитан на Ubuntu 14.04 Trusty, но это ни на что не влияет, для других дистрибутивов все делается также.
wget http://nginx.org/packages/mainline/ubuntu/pool/nginx/n/nginx/nginx_1.9.9-1~trusty.debian.tar.gz
Распакуем полученный архив
tar xvzf nginx_1.9.9-1~trusty.debian.tar.gz
У нас появилась директория debian
Теперь распакуем архив с исходниками Nginx
tar xvzf nginx-1.9.9.tar.gz
Создадим директорию, в которую будем складывать исходные коды модулей nginx
mkdir debian/modules
перейдем в эту директорию и скачаем исходники Lua модуля с github.com
cd debian/modules
git clone https://github.com/openresty/lua-nginx-module
Вернемся обратно в build_dir
cd ../../
Теперь перенесем папку debian в директорию с исходниками nginx
mv debian ./nginx-1.9.9
Удаляем архив, который мы скачали из репозитория nginx, т.к. он нам будет только мешать!
rm -rf nginx_1.9.9-1~trusty.debian.tar.gz
Переходим в директорию nginx-1.9.9
cd nginx-1.9.9
Вот мы и пришли к самой сложной части, с этого места нужно быть внимательным!
Необходимо отредактировать файл changelog
nano debian/changelog
В него записываются изменения которые были внесены в пакет, когда и кем, а также можно задать часть названия пакета, это информация о пакете, которую сможет прочитать пользователь
Для примера моя запись в changelog, да представьте себе, я собираю пакет nginx 1 января, когда вся страна похмеляется… :)
nginx (1.9.9-2) trusty; urgency=low
* 1.9.9
* Add lua module, disable mp4_module, add xslt_module
-- Maxim Ko <info@howitmake.ru> Fri, 01 Jan 2016 12:00:00 +0300
В этом файле очень важно форматирование текста, если поставите лишний пробел или пропустите запятую, то при сборке выйдет ошибка!!!
В общем, за основу можно взять предыдущие записи из этого файла.
Далее откроем файл
nano debian/control
В этот файл записываются необходимые для сборки пакеты, а также зависимости, если таковые необходимы.
Зависимости необходимые для сборки записываются в строку Build-Depends, а зависимости необходимые для установки пакета, записываем в Depends
Т.к. у нас появился новый модуль Lua, то нам необходимо указать для него зависимости, иначе пакет у нас не соберется, а выдаст ошибку из которой станет понятно, что необходимо установить чтобы все прошло гладко. Для сборки LUA нас необходима библиотека libluajit-5.1-dev, а для сборки xslt_module нужен пакет libxslt1-dev
Находим строку и приводим ее к виду указанному ниже:
Build-Depends: debhelper (>= 7.0.50~), libssl-dev (>= 0.9.7), libpcre3-dev, zlib1g-dev, libluajit-5.1-dev, libxslt1-dev
Далее редактируем скрипт которой передает параметры сборки пакета
nano debian/rules
Я не буду приводить весь скрипт целиком, он довольно большой, и его можно легко взять и посмотреть. Нам необходимо добавить в него некоторые переменные, а именно, сказать где искать наши модули
добавим строку такого вида
MODULESDIR = $(CURDIR)/debian/modules
Чтобы выглядело
#!/usr/bin/make -f
MODULESDIR = $(CURDIR)/debian/modules
#export DH_VERBOSE=1
CFLAGS ?= $(shell dpkg-buildflags --get CFLAGS)
LDFLAGS ?= $(shell dpkg-buildflags --get LDFLAGS)
WITH_HTTP2 := $(shell printf "Source: nginx\nBuild-Depends: libssl-dev (>= 1.0.1)\n" | \
dpkg-checkbuilddeps - >/dev/null 2>&1 && \
echo "--with-http_v2_module")
Этим мы указали где лежат модули
Теперь, как и было оговорено ранее, мы удалим не нужный модуль, в качестве примера я выбрал mp4_module
Находим строку и удаляем ее:
--with-http_mp4_module \
Теперь мы добавим шантанный модуль, который по умолчанию не собирается, в качестве примера я выбрал xslt_module
Вместо удаленного модуля mp4, добавляем запись
--with-http_xslt_module \
Ну и добавляем наш сторонний модуль lua-nginx-module нам необходимо добавить запись
--add-module=$(MODULESDIR)/lua-nginx-module
Тогда запись с параметрами сборки Nginx принимают примерно следующий вид:
CFLAGS="" ./configure \
--prefix=/etc/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 \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_xslt_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-http_auth_request_module \
--with-threads \
--with-stream \
--with-stream_ssl_module \
--with-http_slice_module \
--with-mail \
--with-mail_ssl_module \
--with-file-aio \
$(WITH_HTTP2) \
--with-cc-opt="$(CFLAGS)" \
--with-ld-opt="$(LDFLAGS)" \
--with-ipv6 \
--add-module=$(MODULESDIR)/lua-nginx-module
dh_auto_build
Найдите строки подключения модулей самостоятельно…
Прошу обратить внимание на то что отступы могут выполняться не только пробелами он и табуляцией, ошибка в синтаксисе приводит к ошибке при сборке, если в файле отступы выполнены табуляцией, то и вы должны ее использовать.
Приступаем к процессу сборки
В зависимостях для сборки указаны пакеты которые нам необходимо установить, сделаем это:
sudo apt-get install libssl-dev libpcre3-dev zlib1g-dev libluajit-5.1-dev libxslt1-dev
Теперь нам необходимо пересобрать файл nginx_1.9.9.orig.tar.xz
Запускаем команду:
dh_make --copyright gpl -m -e info@howitmake.ru --createorig -y -p nginx_1.9.9
Я не буду описывать ключи запуска, их можно посмотреть через man dh-make
Появится запись, примерно такого содержания:
Maintainer name : artful
Email-Address : info@howitmake.ru
Date : Fri, 01 Jan 2016 12:00:00 +0300
Package Name : nginx
Version : 1.9.9
License : gpl3
Type of Package : Multi-Binary
После окончания его работы в директории build_dir появится файл nginx_1.9.9.orig.tar.xz
Ну и теперь запускам сборку пакета Nginx с нашими параметрами
dpkg-buildpackage -rfakeroot
После завершения работы, система выдаст:
dpkg-deb: building package `nginx' in `../nginx_1.9.9-2_amd64.deb'.
dpkg-deb: building package `nginx-dbg' in `../nginx-dbg_1.9.9-2_amd64.deb'.
dpkg-genchanges >../nginx_1.9.9-2_amd64.changes
dpkg-genchanges: not including original source code in upload
dpkg-source --after-build nginx-1.9.9
dpkg-buildpackage: binary and diff upload (original source NOT included)
Переходим в директорию build_dir
cd ../
И видим что внутри у нас появись файлы вот их список:
-rw-r--r-- 1 artful artful 1484 Jan 1 12:03 nginx_1.9.9-2_amd64.changes
-rw-r--r-- 1 artful artful 704338 Jan 1 12:04 nginx_1.9.9-2_amd64.deb
-rw-r--r-- 1 artful artful 579499 Jan 1 12:04 nginx_1.9.9-2.debian.tar.gz
-rw-r--r-- 1 artful artful 897 Jan 1 17:26 nginx_1.9.9-2.dsc
-rw-r--r-- 1 artful artful 14988660 Jan 1 12:03 nginx_1.9.9.orig.tar.xz
-rw-r--r-- 1 artful artful 2371594 Jan 1 12:04 nginx-dbg_1.9.9-2_amd64.deb
Нас интересует файл nginx_1.9.9-2_amd64.deb
Давайте установим и проверим работоспособность этого пакета
sudo dpkg -i nginx_1.9.9-2_amd64.deb
Если установка прошла успешно, то примите мои поздравления пакет работоспособен…
Давайте теперь взглянем на параметры сборки этого пакета
nginx -V
Если все параметры что мы указывали в наличии, а куда им деться, то можно пользоваться этим пакетом
nginx version: nginx/1.9.9
built by gcc 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04)
built with OpenSSL 1.0.1f 6 Jan 2014
TLS SNI support enabled
configure arguments: --prefix=/etc/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 --pid-path=/var/run/nginx.pid
--lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp
--http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp
--user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module
--with-http_addition_module --with-http_sub_module
--with-http_dav_module --with-http_flv_module
--with-http_xslt_module --with-http_gunzip_module
--with-http_gzip_static_module --with-http_random_index_module
--with-http_secure_link_module --with-http_stub_status_module
--with-http_auth_request_module --with-threads --with-stream
--with-stream_ssl_module --with-http_slice_module
--with-mail --with-mail_ssl_module
--with-file-aio --with-http_v2_module
--with-cc-opt='-g -O2 -fstack-protector
--param=ssp-buffer-size=4 -Wformat -Werror=format-security' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro'
--with-ipv6 --add-module=/home/artful/build_dir/nginx-1.9.9/debian/modules/lua-nginx-module
Дальше вы вольны распоряжаться со своим пакетом как вашей душе угодно, кстати, остальные файлы тоже не пропадут, если вы используете OBS-builder статью о котором я планирую написать уже больше года, но там довольно сложные настройки, а времени не очень много, то если ему скормить 3 файла, а именно:
nginx_1.9.9.orig.tar.xz
nginx_1.9.9-2.dsc
nginx_1.9.9-2.debian.tar.gz
То OBS-builder соберет нужный вам пакет и положит в репозиторий. На моей работа мы используем как раз OBS-builder чтобы поддерживать внутренний репозиторий с необходимыми в для нас пакетами, версий которых нет в репозитории Ubuntu или они там очень старые.
Вот таким способом можно быстро пересобрать пакет, на самом деле тут работы на 5 -7 мин, а пока писал получалось очень долго, сам процесс не сложен, просто требуется внимательность.
На этом будем считать статью завершенной.
1 комментарий
Отличная статья, только что собрал по ней последнюю версию nginx-1.13.8 для 16.04 xenial. Там чуток по другому и ключа -m для dh_make нету. В общем установил, запустил, работает. Чтобы из iRedMail сделать BitrixEnv, нужен nginx-push-stream-module. Но это ещё не всё, так что на завтра мне ещё точно дел хватит =))