Статья описывает сборку deb пакета Nginx из исходных кодов. Я буду собирать сервер с дополнительными модулями: GeoIP, PageSpeed и ModSecurity. Кроме того, в сборку будут входить библиотеки OpenSSL версии 1.1.0g, для поддержки алгоритмов шифрования CHACHA20 и Poly1305. В качестве операционной системы используется Ubuntu Server 16.04.
Собственные deb пакеты имеют множество плюсов по сравнению со стандартными пакетами и программами установленными из исходников. Собственные пакеты можно собрать с нужными опциями, после чего установить как обычный пакет. Но в отличии от make install, deb пакеты устанавливаются пакетным менеджером и им же удаляются, не оставляя после себя мусора в системе.
Пакеты можно пересобирать, обновлять версии исходников, добавлять нужные опции и т.д. В состав deb пакета могут входить не только стандартные файлы программы, но и любые другие. Например, конфигурационные файлы из каталога /etc/nginx, таким образом после установки пакета можно получить уже настроенный сервер.
Хочу заметить что статья является напоминанием для себя и приводится в качестве примера для сборки пакета. Поэтому я не буду подробно описывать настройку модулей и прочих моментов, я рассказываю только про то, как собрать deb пакет. Собирать пакеты лучше всего на виртуальной машине, а готовый и протестированный пакет устанавливать на рабочую машину.
Необходимый софт
Для удобства я разделил весь необходимый софт на группы и расписал что для чего нужно.
Для сборки deb пакетов.
apt-get install dh-make quilt lsb-release debhelper dpkg-dev dh-systemd -y
Для сборки из исходников.
apt-get install build-essential autoconf automake pkg-config libtool -y
Для сборки самого Nginx.
apt-get install libpcre++-dev libssl-dev -y
Для сборки модуля ModSecurity.
apt-get install apache2-dev libxml2-dev libcurl4-gnutls-dev -y
Для сборки Nginx с GeoIP-модулем.
apt-get install libgeoip-dev -y
Каталоги, исходники, файлы deb пакета
Для сборки deb пакета необходимо создать каталог в котором будут находиться исходники и выполняться дальнейшая работа по сборке пакета. Я создаю каталог nginx в /root, все дальнейшие действия будут описаны относительно этого размещения.
Создаем каталог и переходим в него.
mkdir ~/nginx && cd ~/nginx
Теперь нужно скачать исходники последней версии Nginx, на момент написания статьи таковой является 1.13.9.
wget http://nginx.org/download/nginx-1.13.9.tar.gz
Распакуем архив с исходниками.
tar -zxvf nginx-1.13.9.tar.gz
Если продолжать делать по фэн-шую, точнее по руководству начинающего разработчика Debian, то на этом этапе нужно перейти в каталог с исходниками сервера и с помощью dh_make создать начальный пакет. В каталоге с исходниками появится каталог debian, внутри которого будут файлы заготовки файлов, которые нужно править писать с нуля под свои нужды.
Можно поступить проще и скачать готовый архив из репозиториев Nginx. Поскольку я буду собирать пакет со своей конфигурацией сервера, то править файлы все равно придется, но не в таких объемах как если бы писать их с нуля.
Переходим в каталог с исходниками Nginx.
cd nginx-1.13.9
Идем в репозиторий Nginx и ищем подходящий архив (версия сервера + версия системы) - nginx_1.13.9-1~xenial.debian.tar.xz, название архива заканчивается на debian.tar.xz.
wget http://nginx.org/packages/mainline/ubuntu/pool/nginx/n/nginx/nginx_1.13.9-1~xenial.debian.tar.xz
Распакуем архив и удалим его.
tar -xpvJf nginx_1.13.9-1~xenial.debian.tar.xz && rm nginx_1.13.9-1~xenial.debian.tar.xz
В итоге мы получим каталог debian с нужными для сборки deb пакета файлами. Каталог debian обязательно должен находиться внутри каталога с исходниками.
Копирование конфигурационных файлов Nginx
Поскольку после установки я хочу получить уже настроенный сервер, то я добавляю свои конфигурационные файлы, которые при установке пакета распакуются на свои места.
Перейдем в каталог с исходниками Nginx.
cd ~/nginx/nginx-1.13.9
Файлы нужно разместить также, как они размещены в системе. Представим что каталог в котором мы сейчас находимся это корень диска. Например, если nginx.conf располагается в /etc/nginx/nginx.conf, то и здесь он должен располагаться также.
Я создаю каталог etc.
mkdir etc
В etc я копирую каталог nginx со всем его содержимым.
cp -r /etc/nginx ~/nginx/nginx-1.13.9/etc
Позже, при редактировании файла nginx.install, я включу скопированные файлы в состав deb пакета Nginx.
Подготовка модулей Nginx
В рамках данной статьи я не буду подробно описывать установку и настройку каждого модуля, а только опишу порядок действий. Тем более что у меня и так уже все настроено. Подробнее о настройке модулей можно прочитать пройдя по ссылкам приведенным в начале статьи.
Перейдем в каталог с исходниками Nginx.
cd ~/nginx/nginx-1.13.9
Создадим каталог modules внутри каталога debian. В этом каталоге будут находиться исходники модулей и библиотеки OpenSSL.
mkdir debian/modules
Перейдем в каталог modules.
cd debian/modules
OpenSSL
Скачиваем последнюю версию OpenSSL.
wget https://www.openssl.org/source/latest.tar.gz -O openssl-1.1.0.tar.gz
Распаковываем архив и удаляем его.
tar -zxvf openssl-1.1.0.tar.gz && rm -r openssl-1.1.0.tar.gz
ModSecurity
Клонируем исходники ModSecurity с GitHub.
git clone https://github.com/SpiderLabs/ModSecurity.git modsecurity
Переходим в каталог modsecurity.
cd modsecurity
Запускаем скрипт ./autogen.sh.
./autogen.sh
Собираем ModSecurity как отдельный модуль.
./configure --enable-standalone-module
Компилируем.
make
PageSpeed
Возвращаемся в каталог modules.
cd ~/nginx/nginx-1.13.9/debian/modules
Скачиваем архив с PageSpeed.
wget https://github.com/pagespeed/ngx_pagespeed/archive/v1.12.34.3-stable.zip
Распаковываем и удаляем архив.
unzip v1.12.34.3-stable.zip && rm -r v1.12.34.3-stable.zip
Переходим в распакованный каталог.
cd incubator-pagespeed-ngx-1.12.34.3-stable
Скачиваем библиотеки PSOL.
wget https://dl.google.com/dl/page-speed/psol/1.12.34.2-x64.tar.gz
Распаковываем архив и удаляем его.
tar -zxvf 1.12.34.2-x64.tar.gz && rm 1.12.34.2-x64.tar.gz
Отдельно про сборку и настройку Nginx и PageSpeed можно почитать здесь и здесь.
GeoIP
GeoIP не требует никаких действий, его просто включают в сборку сервера добавлением опции "--with-http_geoip_module". Подробнее про GeoIP можно прочитать здесь.
Файлы deb пакета
Файлы находящиеся в каталоге debian и содержащие информацию о создателе пакета, изменениях, конфигурации (changelog, control, rules), nginx.dir и nginx.install, содержат списки каталогов и файлов, которые будут распакованы при установке пакета.
При редактировании файлов стоит обратить внимание на соблюдение табуляции, строк, запятых, пробелов и т.д. Малейшая ошибка при редактировании вызовет ошибку при создании пакета.
Файл changelog
Файл changelog содержит информацию о всех изменениях внесенных в пакет. Поскольку мы вносим в пакет свои изменения, то должны добавить информацию о себе и о пакете. Хотя это не обязательно, если мы делаем пакет для себя, а не для репозиториев.
Пример заполнения файла changelog.
nginx (1.13.9-1~xenial) xenial; urgency=low * 1.13.9 -- Denni Negin <package@techlist.top> Wed, 07 Mar 2018 17:49:23 +0300
Файл control
Файл control является самым важным файлом. Он содержит информацию о создающихся deb пакетах и зависимостях необходимых для их сборки и установки. В стандартном файле control записаны два пакета: nginx и nginx-dbg.
В Build-Depends (зависимости для сборки) указаны программы и библиотеки, которые нужны для сборки deb пакета. Если что-либо отсюда не будет установлено, то при создании пакета будет ошибка, указывающая на необходимость установки программ из списка.
Build-Depends: debhelper (>= 9~), dh-systemd, dpkg-dev (>= 1.16.1~), quilt (>= 0.46-7~), lsb-release, libssl-dev (>= 0.9.7), libpcre3-dev, zlib1g-dev
Помимо Build-Depends в описании каждого пакета присутствует строка Depends. Эта строка отвечает за зависимости, которые будут установлены вместе с пакетом, сюда я добавляю библиотеки, которые нужны для работы сервера и его модулей.
Package: nginx Architecture: any Depends: ${misc:Depends}, ${shlibs:Depends}, lsb-base (>= 3.0-6), apache2-dev, libpcre++-dev, libxml2-dev, libcurl4-gnutls-dev, libssl-dev, libgeoip-dev, libpcre3-dev, zlib1g-dev
Так выглядит файл control после правки.
Source: nginx Section: httpd Priority: optional Maintainer: Denni Negin <package@techlist.top> Build-Depends: debhelper (>= 9~), dh-systemd, dpkg-dev (>= 1.16.1~), quilt (>= 0.46-7~), lsb-release, libssl-dev (>= 0.9.7), libpcre3-dev, zlib1g-dev Standards-Version: 3.9.8.0 Homepage: http://nginx.org Package: nginx Architecture: any Depends: ${misc:Depends}, ${shlibs:Depends}, lsb-base (>= 3.0-6), apache2-dev, libpcre++-dev, libxml2-dev, libcurl4-gnutls-dev, libssl-dev, libgeoip-dev, libpcre3-dev, zlib1g-dev Provides: httpd Conflicts: nginx-common Description: high performance web server nginx [engine x] is an HTTP and reverse proxy server, as well as a mail proxy server. Package: nginx-dbg Architecture: any Section: debug Priority: extra Depends: ${misc:Depends}, nginx (= ${binary:Version}) Description: nginx debug symbols This package contains the debugging symbols for nginx.
Файл rules
Файл rules напоминает Makefile использующийся при компиляции и установке программ из исходных кодов. В файле описаны цели выполняющиеся при сборке и создании пакета.
Первым делом нужно обозначить переменную, которая будет указывать расположение каталога modules. Например так, где $(CURDIR) обозначает каталог с исходниками сервера.
MODULESDIR = $(CURDIR)/debian/modules
Добавим переменную в файл rules сразу после INSTALLDIR.
#!/usr/bin/make -f #export DH_VERBOSE=1 export DEB_BUILD_MAINT_OPTIONS=hardening=+all,-pie export DEB_CFLAGS_MAINT_APPEND=-Wp,-D_FORTIFY_SOURCE=2 -fPIC export DEB_LDFLAGS_MAINT_APPEND=-Wl,--as-needed -pie DPKG_EXPORT_BUILDFLAGS = 1 include /usr/share/dpkg/buildflags.mk PKGS = nginx nginx-dbg BUILDDIR_nginx = $(CURDIR)/debian/build-nginx BUILDDIR_nginx_debug = $(CURDIR)/debian/build-nginx-debug INSTALLDIR = $(CURDIR)/debian/nginx MODULESDIR = $(CURDIR)/debian/modules BASEDIR = $(CURDIR)
Программа собирающая deb пакет не работает за пределами каталога с исходниками, поэтому указать на каталог с модулями подобным образом не получится.
--with-openssl=~/nginx/nginx-1.13.9/debian/modules/openssl-1.1.0g --add-module=~/nginx/nginx-1.13.9/debian/modules/modsecurity/nginx/modsecurity --add-module=~/nginx/nginx-1.13.9/debian/modules/incubator-pagespeed-ngx-1.12.34.3-stable
Зато с помощью переменной можно указать так.
--with-openssl=$(MODULESDIR)/openssl-1.1.0g --add-module=$(MODULESDIR)/modsecurity/nginx/modsecurity --add-module=$(MODULESDIR)/incubator-pagespeed-ngx-1.12.34.3-stable
Изменяю конфигурацию в файле rules и вставляю свои параметры сборки. Добавляю "--with-debug" для debug пакета и переменную вместо ~/nginx/nginx-1.13.9/debian/modules.
config.status.nginx: config.env.nginx cd $(BUILDDIR_nginx) && \ CFLAGS="" ./configure \ --prefix=/etc/nginx \ --conf-path=/etc/nginx/nginx.conf \ --sbin-path=/usr/sbin/nginx \ --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 \ --user=nginx \ --group=nginx \ --without-http_autoindex_module \ --without-http_ssi_module \ --without-http_scgi_module \ --without-http_uwsgi_module \ --without-http_split_clients_module \ --without-http_memcached_module \ --without-http_empty_gif_module \ --without-http_browser_module \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_realip_module \ --with-http_mp4_module \ --with-http_auth_request_module \ --with-http_stub_status_module \ --with-http_random_index_module \ --with-http_gunzip_module \ --with-threads \ --with-http_geoip_module \ --with-openssl=$(MODULESDIR)/openssl-1.1.0g \ --add-module=$(MODULESDIR)/incubator-pagespeed-ngx-1.12.34.3-stable \ --add-module=$(MODULESDIR)/modsecurity/nginx/modsecurity touch $@ config.status.nginx_debug: config.env.nginx_debug cd $(BUILDDIR_nginx_debug) && \ CFLAGS="" ./configure \ --prefix=/etc/nginx \ --conf-path=/etc/nginx/nginx.conf \ --sbin-path=/usr/sbin/nginx \ --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 \ --user=nginx \ --group=nginx \ --without-http_autoindex_module \ --without-http_ssi_module \ --without-http_scgi_module \ --without-http_uwsgi_module \ --without-http_split_clients_module \ --without-http_memcached_module \ --without-http_empty_gif_module \ --without-http_browser_module \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_realip_module \ --with-http_mp4_module \ --with-http_auth_request_module \ --with-http_stub_status_module \ --with-http_random_index_module \ --with-http_gunzip_module \ --with-threads \ --with-http_geoip_module \ --with-openssl=$(MODULESDIR)/openssl-1.1.0g \ --add-module=$(MODULESDIR)/incubator-pagespeed-ngx-1.12.34.3-stable \ --add-module=$(MODULESDIR)/modsecurity/nginx/modsecurity \ --with-debug touch $@
В стандартной конфигурации Nginx собирается с каталогом для модулей в /usr/lib "--modules-path=/usr/lib/nginx/modules", но поскольку в мою конфигурацию данная опция не входит, то я редактирую часть файла rules отвечающую за создание этого каталога.
install: dh_testdir dh_testroot dh_prep dh_installdirs dh_install mkdir -p $(INSTALLDIR)/usr/lib/nginx/modules mkdir -p $(INSTALLDIR)/usr/share/doc/nginx install -m 644 debian/CHANGES $(INSTALLDIR)/usr/share/doc/nginx/changelog install -m 644 debian/nginx.vh.default.conf $(INSTALLDIR)/etc/nginx/conf.d/default.conf ln -s /usr/lib/nginx/modules $(INSTALLDIR)/etc/nginx/modules
Я убираю создание каталога modules и заодно убираю ссылку на каталог modules.
mkdir -p $(INSTALLDIR)/usr/lib/nginx/modules ln -s /usr/lib/nginx/modules $(INSTALLDIR)/etc/nginx/modules
Есть еще один не нужный каталог - conf.d в /etc/nginx. Убираю строку помещающую файл default.conf в /etc/nginx/conf.d.
install -m 644 debian/nginx.vh.default.conf $(INSTALLDIR)/etc/nginx/conf.d/default.conf
Отредактированная цель "install" теперь выглядит так.
install: dh_testdir dh_testroot dh_prep dh_installdirs dh_install mkdir -p $(INSTALLDIR)/usr/share/doc/nginx install -m 644 debian/CHANGES $(INSTALLDIR)/usr/share/doc/nginx/changelog
Файл include-binaries
Файл include-binaries не является обязательным, но в моем случае без него не обойтись. Если при сборке пакета dpkg выдаст похожую ошибку:
dpkg-source: error: detected 17 unwanted binary files (add them in debian/source/include-binaries to allow their inclusion).
Это значит что в ~/nginx/nginx-1.13.9/debian/source, нужно создать файл include-binaries, в который нужно добавить перечисленные в ошибке файлы.
nano ~/nginx/nginx-1.13.9/debian/source/include-binaries
Содержание include-binaries.
debian/modules/modsecurity/mlogc/mlogc debian/modules/modsecurity/tests/regression/server_root/htdocs/8k.txt debian/modules/modsecurity/tests/regression/server_root/htdocs/test.pdf debian/modules/modsecurity/iis/wix/Microsoft_VC110_CRT_x86.msm debian/modules/modsecurity/iis/wix/banner.jpg debian/modules/modsecurity/iis/wix/Microsoft_VC120_CRT_x86.msm debian/modules/modsecurity/iis/wix/Microsoft_VC110_CRT_x64.msm debian/modules/modsecurity/iis/wix/dialog.jpg debian/modules/modsecurity/iis/wix/Microsoft_VC120_CRT_x64.msm debian/modules/modsecurity/doc/doxygen-logo.png debian/modules/incubator-pagespeed-ngx-1.12.34.3-stable/psol/lib/Release/linux/x64/pagespeed_js_minify debian/modules/openssl-1.1.0g/test/shibboleth.pfx debian/modules/openssl-1.1.0g/test/d2i-tests/bad_cert.der debian/modules/openssl-1.1.0g/test/d2i-tests/int0.der debian/modules/openssl-1.1.0g/test/d2i-tests/bad-int-pad0.der debian/modules/openssl-1.1.0g/test/d2i-tests/bad_bio.der debian/modules/openssl-1.1.0g/test/d2i-tests/high_tag.der
Файл nginx.dirs
В файле nginx.dirs указан список каталогов необходимых для обычной установки Nginx. По умолчанию файл выглядит так.
/usr/sbin /etc/nginx/conf.d /usr/lib/nginx/modules /usr/share/nginx /usr/share/nginx/html /var/cache/nginx /var/log/nginx
Убираю из него /etc/nginx/conf.d и /usr/lib/nginx/modules и добавляю нужные мне каталоги. Отредактированный файл выглядит так.
/etc/nginx/conf /etc/nginx/geoip /etc/nginx/global_conf /etc/nginx/html /etc/nginx/lists /etc/nginx/modsec/rules /etc/nginx/sites-available /etc/nginx/sites-enabled /etc/nginx/ssl/techlist /usr/sbin /usr/share/nginx /usr/share/nginx/html /var/log/nginx /var/cache/nginx
Файл nginx.install
Файл nginx.install содержит список файлов, которые добавляются в пакет при создании. Каждый файл записывается отдельной строкой. Сначала пишется размещение файла относительно каталога сборки (откуда брать), потом через пробел каталог установки (куда устанавливать).
Файл nginx.install по умолчанию.
debian/nginx.conf etc/nginx conf/win-utf etc/nginx conf/koi-utf etc/nginx conf/koi-win etc/nginx conf/mime.types etc/nginx conf/scgi_params etc/nginx conf/fastcgi_params etc/nginx conf/uwsgi_params etc/nginx html/index.html usr/share/nginx/html html/50x.html usr/share/nginx/html debian/build-nginx/objs/nginx usr/sbin debian/build-nginx-debug/objs/nginx-debug usr/sbin
Добавляю свой список файлов, а по сути, просто переписываю содержимое каталога nginx.
etc/nginx/koi-win etc/nginx etc/nginx/koi-utf etc/nginx etc/nginx/win-utf etc/nginx etc/nginx/mime.types etc/nginx etc/nginx/nginx.conf etc/nginx etc/nginx/fastcgi.conf etc/nginx etc/nginx/scgi_params etc/nginx etc/nginx/uwsgi_params etc/nginx etc/nginx/fastcgi_params etc/nginx etc/nginx/conf/gzip.conf etc/nginx/conf etc/nginx/conf/cache.conf etc/nginx/conf etc/nginx/conf/pagespeed.conf etc/nginx/conf etc/nginx/conf/php.techlist.conf etc/nginx/conf etc/nginx/geoip/GeoIP.dat etc/nginx/geoip etc/nginx/geoip/GeoLiteCity.dat etc/nginx/geoip etc/nginx/global_conf/geoip.conf etc/nginx/global_conf etc/nginx/global_conf/restrictions.conf etc/nginx/global_conf etc/nginx/global_conf/block_ip_access.conf etc/nginx/global_conf etc/nginx/html/50x.html etc/nginx/html etc/nginx/html/index.html etc/nginx/html etc/nginx/html/error403.html etc/nginx/html etc/nginx/lists/spammers etc/nginx/lists etc/nginx/lists/bad_useragents etc/nginx/lists etc/nginx/lists/good_countries etc/nginx/lists etc/nginx/modsec/unicode.mapping etc/nginx/modsec etc/nginx/modsec/modsecurity.conf etc/nginx/modsec etc/nginx/modsec/rules/sql-errors.data etc/nginx/modsec/rules etc/nginx/modsec/rules/php-errors.data etc/nginx/modsec/rules etc/nginx/modsec/rules/iis-errors.data etc/nginx/modsec/rules etc/nginx/modsec/rules/unix-shell.data etc/nginx/modsec/rules etc/nginx/modsec/rules/java-errors.data etc/nginx/modsec/rules etc/nginx/modsec/rules/lfi-os-files.data etc/nginx/modsec/rules etc/nginx/modsec/rules/scanners-urls.data etc/nginx/modsec/rules etc/nginx/modsec/rules/php-variables.data etc/nginx/modsec/rules etc/nginx/modsec/rules/scanners-headers.data etc/nginx/modsec/rules etc/nginx/modsec/rules/restricted-files.data etc/nginx/modsec/rules etc/nginx/modsec/rules/java-code-leakages.data etc/nginx/modsec/rules etc/nginx/modsec/rules/sql-function-names.data etc/nginx/modsec/rules etc/nginx/modsec/rules/crawlers-user-agents.data etc/nginx/modsec/rules etc/nginx/modsec/rules/scanners-user-agents.data etc/nginx/modsec/rules etc/nginx/modsec/rules/scripting-user-agents.data etc/nginx/modsec/rules etc/nginx/modsec/rules/php-config-directives.data etc/nginx/modsec/rules etc/nginx/modsec/rules/php-function-names-933150.data etc/nginx/modsec/rules etc/nginx/modsec/rules/php-function-names-933151.data etc/nginx/modsec/rules etc/nginx/modsec/rules/windows-powershell-commands.data etc/nginx/modsec/rules etc/nginx/modsec/rules/RESPONSE-980-CORRELATION.conf etc/nginx/modsec/rules etc/nginx/modsec/rules/REQUEST-910-IP-REPUTATION.conf etc/nginx/modsec/rules etc/nginx/modsec/rules/REQUEST-912-DOS-PROTECTION.conf etc/nginx/modsec/rules etc/nginx/modsec/rules/RESPONSE-950-DATA-LEAKAGES.conf etc/nginx/modsec/rules etc/nginx/modsec/rules/REQUEST-921-PROTOCOL-ATTACK.conf etc/nginx/modsec/rules etc/nginx/modsec/rules/REQUEST-905-COMMON-EXCEPTIONS.conf etc/nginx/modsec/rules etc/nginx/modsec/rules/REQUEST-913-SCANNER-DETECTION.conf etc/nginx/modsec/rules etc/nginx/modsec/rules/RESPONSE-951-DATA-LEAKAGES-SQL.conf etc/nginx/modsec/rules etc/nginx/modsec/rules/RESPONSE-954-DATA-LEAKAGES-IIS.conf etc/nginx/modsec/rules etc/nginx/modsec/rules/RESPONSE-953-DATA-LEAKAGES-PHP.conf etc/nginx/modsec/rules etc/nginx/modsec/rules/RESPONSE-952-DATA-LEAKAGES-JAVA.conf etc/nginx/modsec/rules etc/nginx/modsec/rules/REQUEST-949-BLOCKING-EVALUATION.conf etc/nginx/modsec/rules etc/nginx/modsec/rules/RESPONSE-959-BLOCKING-EVALUATION.conf etc/nginx/modsec/rules etc/nginx/modsec/rules/REQUEST-930-APPLICATION-ATTACK-LFI.conf etc/nginx/modsec/rules etc/nginx/modsec/rules/REQUEST-933-APPLICATION-ATTACK-PHP.conf etc/nginx/modsec/rules etc/nginx/modsec/rules/REQUEST-931-APPLICATION-ATTACK-RFI.conf etc/nginx/modsec/rules etc/nginx/modsec/rules/REQUEST-932-APPLICATION-ATTACK-RCE.conf etc/nginx/modsec/rules etc/nginx/modsec/rules/REQUEST-941-APPLICATION-ATTACK-XSS.conf etc/nginx/modsec/rules etc/nginx/modsec/rules/REQUEST-903.9002-WORDPRESS-EXCLUSION-RULES.conf etc/nginx/modsec/rules etc/nginx/modsec/rules/REQUEST-943-APPLICATION-ATTACK-SESSION-FIXATION.conf etc/nginx/modsec/rules etc/nginx/sites-available/techlist etc/nginx/sites-available etc/nginx/ssl/techlist/dh_2048.pem etc/nginx/ssl/techlist etc/nginx/ssl/techlist/dh_4096.pem etc/nginx/ssl/techlist etc/nginx/ssl/techlist/techlist.key etc/nginx/ssl/techlist etc/nginx/ssl/techlist/techlist.top.crt etc/nginx/ssl/techlist html/50x.html usr/share/nginx/html html/index.html usr/share/nginx/html debian/build-nginx/objs/nginx usr/sbin debian/build-nginx-debug/objs/nginx-debug usr/sbin
Сборка пакета
Приступаем непосредственно к сборке пакета и переходим в каталог с исходниками.
cd ~/nginx/nginx-1.13.9
Прежде чем запускать сборщик, я создаю контрольный снимок виртуальной машины, чтобы если понадобится иметь возможность откатиться и внести изменения в файлы или исходники.
Запускаем dh_make для создания начального пакета.
- --copyright gpl - указываем тип лицензии
- -e package@techlist.top - электронный адрес создателя пакета
- --createorig - создать архив с оригинальными файлами orig.tar.xz
- -s - указываем тип пакета "single"
- -p nginx_1.13.9 - название пакета
- -y - "yes" автоматом (чтобы лишний раз не вводить у при создании)
dh_make --copyright gpl -e package@techlist.top --createorig -s -y -p nginx_1.13.9
Выхлоп должен быть примерно следующий.
Email-Address : package@techlist.top License : gpl2 Package Name : nginx Maintainer Name : root Version : 1.13.9 Package Type : single Date : Wed, 07 Mar 2018 17:49:23 +0300 You already have a debian/ subdirectory in the sourcetree. dh_make will not try to overwrite anything.
Запускаем сборку пакета dpkg-buildpackage (может занять продолжительное время).
- -us - unsigned source package (собирать пакет с неподписанными исходниками )
- -uc - unsigned .changes file (собирать пакет с неподписанными изменениями в файлах)
dpkg-buildpackage -us -uc
Во время сборки dbg-пакета может выскочить предупреждение, если вы собираете сервер вместе с модулем PageSpeed. Поскольку dbg пакет мне не нужен, то я просто нажимаю "Y". (Что это такое, я не вникал, потому хз)
You have set --with-debug for building nginx, but precompiled Debug binaries for PSOL, which ngx_pagespeed depends on, aren't available. If you're trying to debug PSOL you need to build it from source. If you just want to run nginx with debug-level logging you can use the Release binaries. Use the available Release binaries? [Y/n] y
Вот так выглядит успешное создание пакета.
dpkg-deb: building package 'nginx' in '../nginx_1.13.9-1~xenial_amd64.deb'. dpkg-deb: building package 'nginx-dbg' in '../nginx-dbg_1.13.9-1~xenial_amd64.deb'. dpkg-genchanges >../nginx_1.13.9-1~xenial_amd64.changes dpkg-genchanges: including full source code in upload dpkg-source --after-build nginx-1.13.9 dpkg-buildpackage: full upload (original source is included)
Готовый пакет находится в каталоге ~/nginx, там же находятся все сопутствующие архивы. На самом деле нужен только nginx_1.13.9-1~xenial_amd64.deb, это и есть тот самый пакет, который будет установлен.
Содержимое deb пакета можно просмотреть, чтобы убедиться что он правильно собран и в его состав входят все нужные файлы. Просмотреть пакет можно командой dpkg -с и указав его название.
dpkg -c nginx_1.13.9-1~xenial_amd64.deb
Команда выводит список всех каталогов и файлов внутри пакета их владельца и прав доступа. При установке пакета все эти файлы будут распакованы на свои места, так как указано в списке.
Установка deb пакета
Готовый deb пакет устанавливается менеджером пакетов dpkg, ключ "-i" указывает на название пакета. Чтобы установить пакет нужно находиться в том же каталоге что и сам пакет.
# Переходим в каталог с пакетом cd ~/nginx # Устанавливаем пакет dpkg -i nginx_1.13.9-1~xenial_amd64.deb Selecting previously unselected package nginx. (Reading database ... 135144 files and directories currently installed.) Preparing to unpack nginx_1.13.9-1~xenial_amd64.deb ... ---------------------------------------------------------------------- Thanks for using nginx! Please find the official documentation for nginx here: * http://nginx.org/en/docs/ Please subscribe to nginx-announce mailing list to get the most important news about nginx: * http://nginx.org/en/support.html Commercial subscriptions for nginx are available on: * http://nginx.com/products/ ---------------------------------------------------------------------- Unpacking nginx (1.13.9-1~xenial) ... Setting up nginx (1.13.9-1~xenial) ... Processing triggers for man-db (2.7.5-1) ... Processing triggers for systemd (229-4ubuntu21.1) ... Processing triggers for ureadahead (0.100.0-19) ...
Так, как показано на примере выше, установка пакета срабатывает только в том случае, если пакет ставится на ту же машину, где и собирался. В таком случае все необходимые зависимости уже установлены, поскольку они были нужны для его сборки.
Но если пакет нужно установить на другую машину, то при установке deb пакета может возникнуть проблема с зависимостями, поскольку dpkg не устанавливает зависимости вместе с пакетом и все будет выглядеть примерно так.
Selecting previously unselected package nginx. (Reading database ... 90295 files and directories currently installed.) Preparing to unpack nginx_1.13.9-1~xenial_amd64.deb ... ---------------------------------------------------------------------- Thanks for using nginx! Please find the official documentation for nginx here: * http://nginx.org/en/docs/ Please subscribe to nginx-announce mailing list to get the most important news about nginx: * http://nginx.org/en/support.html Commercial subscriptions for nginx are available on: * http://nginx.com/products/ ---------------------------------------------------------------------- Unpacking nginx (1.13.9-1~xenial) ... dpkg: dependency problems prevent configuration of nginx: nginx depends on libapr1 (>= 1.2.7); however: Package libapr1 is not installed. nginx depends on libaprutil1 (>= 1.4.0); however: Package libaprutil1 is not installed. nginx depends on libgeoip1; however: Package libgeoip1 is not installed. nginx depends on apache2-dev; however: Package apache2-dev is not installed. nginx depends on libpcre++-dev; however: Package libpcre++-dev is not installed. nginx depends on libxml2-dev; however: Package libxml2-dev is not installed. nginx depends on libcurl4-gnutls-dev; however: Package libcurl4-gnutls-dev is not installed. nginx depends on libssl-dev; however: Package libssl-dev is not installed. nginx depends on libgeoip-dev; however: Package libgeoip-dev is not installed. nginx depends on libpcre3-dev; however: Package libpcre3-dev is not installed. nginx depends on zlib1g-dev; however: Package zlib1g-dev is not installed. dpkg: error processing package nginx (--install): dependency problems - leaving unconfigured Processing triggers for systemd (229-4ubuntu19) ... Processing triggers for ureadahead (0.100.0-19) ... Errors were encountered while processing: nginx
Сам пакет будет установлен, файлы будут распакованы, каталоги созданы, но пока мы не установим зависимости, запустить сервер и заставить его работать не получится.
root@local:~# systemctl start nginx Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details. root@local:~# systemctl status nginx ● nginx.service - nginx - high performance web server Loaded: loaded (/lib/systemd/system/nginx.service; disabled; vendor preset: enabled) Active: failed (Result: exit-code) since Wed 2018-03-07 22:15:46 MSK; 2s ago Docs: http://nginx.org/en/docs/ Process: 1567 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=127) Mar 07 22:15:46 local systemd[1]: Starting nginx - high performance web server... Mar 07 22:15:46 local nginx[1567]: /usr/sbin/nginx: error while loading shared libraries: libapr-1.so.0: cannot open shared object Mar 07 22:15:46 local systemd[1]: nginx.service: Control process exited, code=exited status=127 Mar 07 22:15:46 local systemd[1]: Failed to start nginx - high performance web server. Mar 07 22:15:46 local systemd[1]: nginx.service: Unit entered failed state. Mar 07 22:15:46 local systemd[1]: nginx.service: Failed with result 'exit-code'.
Сервер будет ругаться на невозможность загрузки и отсутствие нужных библиотек.
Mar 07 22:15:46 local nginx[1567]: /usr/sbin/nginx: error while loading shared libraries: libapr-1.so.0: cannot open shared object
Помимо этого, все файлы в каталоге /etc/nginx будут переименованы, к имени каждого файла будет добавлено окончание .dpkg-new.
Все это лечится путем установки зависимостей. Чтобы установить зависимости выполняем apt-get -f install, сразу после установки пакета.
apt-get -f install
После установки зависимостей файлы станут называться своими привычными именами.
systemctl enable nginx.service systemctl start nginx.service
Проверяем.
systemctl status nginx ● nginx.service - nginx - high performance web server Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2018-03-07 22:31:43 MSK; 3s ago Docs: http://nginx.org/en/docs/ Process: 20609 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS) Main PID: 20613 (nginx) Tasks: 2 Memory: 38.7M CPU: 74ms CGroup: /system.slice/nginx.service ├─20613 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.con └─20614 nginx: worker process Mar 07 22:31:40 local systemd[1]: Starting nginx - high performance web server... Mar 07 22:31:43 local systemd[1]: Started nginx - high performance web server.
nginx -V nginx version: nginx/1.13.9 built by gcc 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.9) built with OpenSSL 1.1.0g 2 Nov 2017 TLS SNI support enabled configure arguments: --prefix=/etc/nginx --conf-path=/etc/nginx/nginx.conf --sbin-path=/usr/sbin/nginx --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 --user=nginx --group=nginx --without-http_autoindex_module --without-http_ssi_module --without-http_scgi_module --without-http_uwsgi_module --without-http_split_clients_module --without-http_memcached_module --without-http_empty_gif_module --without-http_browser_module --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_mp4_module --with-http_auth_request_module --with-http_stub_status_module --with-http_random_index_module --with-http_gunzip_module --with-threads --with-http_geoip_module --with-openssl=/root/nginx/nginx-1.13.9/debian/modules/openssl-1.1.0g --add-module=/root/nginx/nginx-1.13.9/debian/modules/incubator-pagespeed-ngx-1.12.34.3-stable --add-module=/root/nginx/nginx-1.13.9/debian/modules/modsecurity/nginx/modsecurity