Deb пакет Nginx - сборка из исходников.

deb package debian ubuntu nginx

Статья описывает сборку deb пакета Nginx из исходных кодов. Я буду собирать сервер с дополнительными, не входящими в стандартную сборку модулями: GeoIP, PageSpeed и ModSecurity. Кроме того, в сборку будут входить библиотеки OpenSSL версии 1.1.0g, для поддержки алгоритмов шифрования CHACHA20 и Poly1305. В качестве операционной системы используется Ubuntu Server 16.04.

Собственные deb пакеты имеют множество плюсов по сравнению со стандартными пакетами и программами установленными из исходников. Собственные пакеты можно собрать с нужными опциями, после чего установить как обычный пакет. Но в отличии от make install, deb пакеты устанавливаются пакетным менеджером и им же удаляются, не оставляя после себя мусора в системе.

Пакеты можно пересобирать, обновлять версии исходников, добавлять нужные опции и т.д. В состав deb пакета могут входить не только стандартные файлы программы, но и любые другие. Например, конфигурационные файлы из каталога /etc/nginx, таким образом после установки пакета можно получить уже настроенный сервер.

Хочу заметить что статья является напоминанием для себя и приводится в качестве примера для сборки пакета. Поэтому я не буду подробно описывать настройку модулей и прочих моментов, я рассказываю только про то, как собрать deb пакет. Собирать пакеты лучше всего на виртуальной машине, а готовый и протестированный пакет устанавливать на рабочую машину.

Необходимый софт

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

Для сборки deb пакетов.

Для сборки из исходников.

Для сборки самого Nginx.

Для сборки модуля ModSecurity.

Для сборки Nginx с GeoIP-модулем.

Каталоги, исходники, файлы deb пакета

Для сборки deb пакета необходимо создать каталог в котором будут находиться исходники и выполняться дальнейшая работа по сборке пакета. Я создаю каталог nginx в /root, все дальнейшие действия будут описаны относительно этого размещения.

Создаем каталог и переходим в него.

Теперь нужно скачать исходники последней версии Nginx, на момент написания статьи таковой является 1.13.9.

Распакуем архив с исходниками.

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

Можно поступить проще и скачать готовый архив из репозиториев Nginx. Поскольку я буду собирать пакет со своей конфигурацией сервера, то править файлы все равно придется, но не в таких объемах как если бы писать их с нуля.

Переходим в каталог с исходниками Nginx.

Идем в репозиторий Nginx и ищем подходящий архив (версия сервера + версия системы) - nginx_1.13.9-1~xenial.debian.tar.xz, название архива заканчивается на debian.tar.xz.

Распакуем архив и удалим его.

В итоге мы получим каталог debian с нужными для сборки deb пакета файлами. Каталог debian обязательно должен находиться внутри каталога с исходниками.

Копирование конфигурационных файлов Nginx

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

Перейдем в каталог с исходниками Nginx.

Файлы нужно разместить также, как они размещены в системе. Представим что каталог в котором мы сейчас находимся это корень диска. Например, если nginx.conf располагается в /etc/nginx/nginx.conf, то и здесь он должен располагаться также.

Я создаю каталог etc.

В etc я копирую каталог nginx со всем его содержимым.

Позже, при редактировании файла nginx.install, я включу скопированные файлы в состав deb пакета Nginx.

Подготовка модулей Nginx

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

Перейдем в каталог с исходниками Nginx.

Создадим каталог modules внутри каталога debian. В этом каталоге будут находиться исходники модулей и библиотеки OpenSSL.

Перейдем в каталог modules.

OpenSSL

Скачиваем последнюю версию OpenSSL.

Распаковываем архив и удаляем его.

ModSecurity

Клонируем исходники ModSecurity с GitHub.

Переходим в каталог modsecurity.

Запускаем скрипт ./autogen.sh.

Собираем ModSecurity как отдельный модуль.

Компилируем.

PageSpeed

Возвращаемся в каталог modules.

Скачиваем архив с PageSpeed.

Распаковываем и удаляем архив.

Переходим в распакованный каталог.

Скачиваем библиотеки PSOL.

Распаковываем архив и удаляем его.

Отдельно про сборку и настройку Nginx и PageSpeed можно почитать здесь и здесь.

GeoIP

GeoIP не требует никаких действий, его просто включают в сборку сервера добавлением опции "--with-http_geoip_module". Подробнее про GeoIP можно прочитать здесь.

Файлы deb пакета

Файлы находящиеся в каталоге debian и содержащие информацию о создателе пакета, изменениях, конфигурации (changelog, control, rules), nginx.dir и nginx.install, содержат списки каталогов и файлов, которые будут распакованы при установке пакета.

При редактировании файлов стоит обратить внимание на соблюдение табуляции, строк, запятых, пробелов и т.д. Малейшая ошибка при редактировании вызовет ошибку при создании пакета.

Файл changelog

Файл changelog содержит информацию о всех изменениях внесенных в пакет. Поскольку мы вносим в пакет свои изменения, то должны добавить информацию о себе и о пакете. Хотя это не обязательно, если мы делаем пакет для себя, а не для репозиториев.

Пример заполнения файла changelog.

Файл control

Файл control является самым важным файлом. Он содержит информацию о создающихся deb пакетах и зависимостях необходимых для их сборки и установки. В стандартном файле control записаны два пакета: nginx и nginx-dbg.

В Build-Depends (зависимости для сборки) указаны программы и библиотеки, которые нужны для сборки deb пакета. Если что-либо отсюда не будет установлено, то при создании пакета будет ошибка, указывающая на необходимость установки программ из списка.

Помимо Build-Depends в описании каждого пакета присутствует строка Depends. Эта строка отвечает за зависимости, которые будут установлены вместе с пакетом, сюда я добавляю библиотеки, которые нужны для работы сервера и его модулей.

Так выглядит файл control после правки.

Файл rules

Файл rules напоминает Makefile использующийся при компиляции и установке программ из исходных кодов. В файле описаны цели выполняющиеся при сборке и создании пакета.

Первым делом нужно обозначить переменную, которая будет указывать расположение каталога modules. Например так, где $(CURDIR) обозначает каталог с исходниками сервера.

Добавим переменную в файл rules сразу после INSTALLDIR.

Программа собирающая deb пакет не работает за пределами каталога с исходниками, поэтому указать на каталог с модулями подобным образом не получится.

Зато с помощью переменной можно указать так.

Изменяю конфигурацию в файле rules и вставляю свои параметры сборки. Добавляю "--with-debug" для debug пакета и переменную вместо ~/nginx/nginx-1.13.9/debian/modules.

В стандартной конфигурации Nginx собирается с каталогом для модулей в /usr/lib "--modules-path=/usr/lib/nginx/modules", но поскольку в мою конфигурацию данная опция не входит, то я редактирую часть файла rules отвечающую за создание этого каталога.

Я убираю создание каталога modules и заодно убираю ссылку на каталог modules.

Есть еще один не нужный каталог - conf.d в /etc/nginx. Убираю строку помещающую файл default.conf в /etc/nginx/conf.d.

Отредактированная цель "install" теперь выглядит так.

Файл include-binaries

Файл include-binaries не является обязательным, но в моем случае без него не обойтись. Если при сборке пакета dpkg выдаст похожую ошибку:

Это значит что в ~/nginx/nginx-1.13.9/debian/source, нужно создать файл include-binaries, в который нужно добавить перечисленные в ошибке файлы.

Содержание include-binaries.

Файл nginx.dirs

В файле nginx.dirs указан список каталогов необходимых для обычной установки Nginx. По умолчанию файл выглядит так.

Убираю из него /etc/nginx/conf.d и /usr/lib/nginx/modules и добавляю нужные мне каталоги. Отредактированный файл выглядит так.

Файл nginx.install

Файл nginx.install содержит список файлов, которые добавляются в пакет при создании. Каждый файл записывается отдельной строкой. Сначала пишется размещение файла относительно каталога сборки (откуда брать), потом через пробел каталог установки (куда устанавливать).

Файл nginx.install по умолчанию.

Добавляю свой список файлов, а по сути, просто переписываю содержимое каталога nginx.

Сборка пакета

Приступаем непосредственно к сборке пакета и переходим в каталог с исходниками.

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

Запускаем dh_make для создания начального пакета.

  • --copyright gpl - указываем тип лицензии
  • -e package@techlist.top - электронный адрес создателя пакета
  • --createorig - создать архив с оригинальными файлами orig.tar.xz
  • -s - указываем тип пакета "single"
  • -p nginx_1.13.9 - название пакета
  • -y - "yes" автоматом (чтобы лишний раз не вводить у при создании)
Выхлоп должен быть примерно следующий.
Запускаем сборку пакета dpkg-buildpackage (может занять продолжительное время).

  • -us - unsigned source package (собирать пакет с неподписанными исходниками )
  • -uc - unsigned .changes file (собирать пакет с неподписанными изменениями в файлах)

Во время сборки dbg-пакета может выскочить предупреждение, если вы собираете сервер вместе с модулем PageSpeed. Поскольку dbg пакет мне не нужен, то я просто нажимаю "Y". (Что это такое, я не вникал, потому хз)

Вот так выглядит успешное создание пакета.

Готовый пакет находится в каталоге ~/nginx, там же находятся все сопутствующие архивы. На самом деле нужен только nginx_1.13.9-1~xenial_amd64.deb, это и есть тот самый пакет, который будет установлен.

Содержимое deb пакета можно просмотреть, чтобы убедиться что он правильно собран и в его состав входят все нужные файлы. Просмотреть пакет можно командой dpkg -с и указав его название.

Команда выводит список всех каталогов и файлов внутри пакета их владельца и прав доступа. При установке пакета все эти файлы будут распакованы на свои места, так как указано в списке.

Список каталогов и файлов пакета

Установка deb пакета

Готовый deb пакет устанавливается менеджером пакетов dpkg, ключ "-i" указывает на название пакета. Чтобы установить пакет нужно находиться в том же каталоге что и сам пакет.

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

Но если пакет нужно установить на другую машину, то при установке deb пакета может возникнуть проблема с зависимостями, поскольку dpkg не устанавливает зависимости вместе с пакетом и все будет выглядеть примерно так.

Сам пакет будет установлен, файлы будут распакованы, каталоги созданы, но пока мы не установим зависимости, запустить сервер и заставить его работать не получится.

Сервер будет ругаться на невозможность загрузки и отсутствие нужных библиотек.

Помимо этого, все файлы в каталоге /etc/nginx будут переименованы, к имени каждого файла будет добавлено окончание .dpkg-new.

deb package nginx

Все это лечится путем установки зависимостей. Чтобы установить зависимости выполняем apt-get -f install, сразу после установки пакета.

После установки зависимостей файлы станут называться своими привычными именами.

deb package nginxМожно запускать сервер.

Проверяем.

На этом все. Благодарю за внимание.