Сборка nginx на Debian

Материал из support.qbpro.ru

Custom-сборка nginx на Debian

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

Последовательность действий такова:

  • Скачать исходники пакета nginx
  • Распаковать исходники.
  • Изменить конфигурацию.
  • Собрать пакет.

Начнем с того, что установим необходимые библиотеки:

aptitude install dpkg-dev

Далее необходимо найти нужную версию nginx здесь: http://snapshot.debian.org/package/nginx/. Данный ресурс хранит все пакеты, которые когда-либо присутствовали в Debian. Для примера мы выбрали версию 0.8.54-4. Создадим временную папку и загрузим туда необходимые файлы:

mkdir /tmp/nginx
cd /tmp/nginx/
wget [1]http://snapshot.debian.org/archive/debian/20110305T151450Z/pool/main/n/nginx/nginx_0.8.54-4.debian.tar.gz
[2]http://snapshot.debian.org/archive/debian/20110305T151450Z/pool/main/n/nginx/nginx_0.8.54-4.dsc 
[3]http://snapshot.debian.org/archive/debian/20101231T205910Z/pool/main/n/nginx/nginx_0.8.54.orig.tar.gz

Далее распакуем пакет исходных кодов в папку:

dpkg-source -x nginx_0.8.54-4.dsc

Теперь следует по своему вкусу осуществить редактирование параметров конфигурирования компиляции, которые расположены в файле nginx-0.8.54/debian/rules. Я обычно беру сборку nginx-full и просто добавляю/убираю пункты. Например, может получиться такая конфигурация, в которой исключены mail-модули:

config.status.full: config.env.full config.sub config.guess
   cd $(BUILDDIR_full) && ./configure \
       --conf-path=/etc/nginx/nginx.conf \
       --error-log-path=/var/log/nginx/error.log \
       --http-client-body-temp-path=/var/lib/nginx/body \
       --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
       --http-log-path=/var/log/nginx/access.log \
       --http-proxy-temp-path=/var/lib/nginx/proxy \
       --http-scgi-temp-path=/var/lib/nginx/scgi \
       --http-uwsgi-temp-path=/var/lib/nginx/uwsgi \
       --lock-path=/var/lock/nginx.lock \
       --pid-path=/var/run/nginx.pid \
       --with-debug \
       --with-http_addition_module \
       --with-http_dav_module \
       --with-http_geoip_module \
       --with-http_gzip_static_module \
       --with-http_image_filter_module \
       --with-http_realip_module \
       --with-http_stub_status_module \
       --with-http_ssl_module \
       --with-http_sub_module \
       --with-http_xslt_module \
       --with-http_degradation_module \
       --with-http_random_index_module \
       --with-http_secure_link_module \
       --without-mail_pop3_module \
       --without-mail_imap_module \
       --without-mail_smtp_module \
       --with-ipv6 \
       --with-sha1=/usr/include/openssl \
       --with-md5=/usr/include/openssl \
       --add-module=$(MODULESDIR)/nginx-upstream-fair \
           $(CONFIGURE_OPTS) >$@

После того, как все изменения внесены, соберем deb-пакет следующей командой (которую необходимо выполнить из каталога, куда были распакованы исходные коды пакета):

dpkg-buildpackage -uc -b -us

Полученные deb файлы после окончания сборки будут лежать в каталоге выше (в нашем случае /tmp/nginx), после этого останется установить пакет nginx-common и nginx-full (или другой, смотря какой был редактирован в файле rules).

Еще одна настройка, которая будет полезна некоторым - это блокирование обновления пакетов. Осуществляется это следующими командами:

echo nginx-common hold | dpkg --set-selections
echo nginx-full hold | dpkg --set-selections

Правильная сборка с соблюдением всех нюансов Debian

NodeSquad

среда, 5 октября 2011 г. Сборка Nginx под Debian Поставим сначала пакеты. Возможно вам пригодятся еще какие-то, но об этом вы узнаете, если какая-то команда не запустится:

   apt-get install libpcre++-dev libssl-dev libgeoip-dev dh-make autotools-dev gcc-4.3 debhelper devscripts

Также перед началом вписываем себе в переменное окружение (~/.bashrc) наши опознавательные знаки:

   DEBEMAIL="email.address@example.org"
   DEBFULLNAME="Имя Фамилия"
   export DEBEMAIL DEBFULLNAME


И применяем их:

   source ~/.bashrc


Переходим в директорию, где будем работать:

   cd /usr/src


Выбираем нужную версию программы на сайте. И скачиваем её:

   wget http://nginx.org/download/nginx-1.0.8.tar.gz


Распаковываем, но сам тарбол не стираем и оставляем его на месте(!!!):

   tar xzf nginx-1.0.8.tar.gz


Теперь нужно переименовать директорию с сорцами, потому что далее сборщик deb-пакета возьмет название и номер версии отсюда. Правило одно - слева имя пакета (оставим его nginx, чтобы он заменял стандартный) и следом первый дефис. А второй дефис разделяет версию пакета и версию мейнтейнера. И никаких подчеркиваний! Итак меняем версию:

   mv nginx-1.0.8 nginx-1.0.8-nsq1



И переходим в эту директорию:

   cd nginx-1.0.8-nsq1



Начало необязательной части, которую можно пропустить. Возможно кому-то захочется скрыть версию пакета в целях безопасности. Делается это либо директивой server_tokens = Off позже в конфиге либо сейчас правкой 49-й строки здесь:

   vi +49 src/http/ngx_http_header_filter_module.c


Если кому хочется, можно поменять конфиг сразу, чтобы пакет разворачивался уже с готовым конфигом:

   vi conf/nginx.conf 


Можно также добавить модули Nginx.

Конец необязательной части.


Деперь "дебианизируем" пакет:

   dh_make --single -f ../nginx-1.0.8.tar.gz


В результате в этой директории появилась поддиректория debian, а уровнем выше, где мы оставили тарбол, появилась копия тарбола с надписью orig.

Поправим пару параметров перед сборкой. Например Description (один пробел слева как на образце обязателен):

   vi debian/control


   Description: small, but very powerful and efficient web server
    Nginx (engine x) is a web server created by Igor Sysoev and kindly provided
    to the open-source community. This server can be used as standalone HTTP
    server and as a reverse proxy server before some Apache or another big
    server to reduce load to backend servers by many concurrent HTTP-sessions


Далее делаем вещь, специфическую для nginx - запрещаем стандартную автоконфигурацию и вписываем свою (ВНИМАНИЕ: перед строкой ./configure --pref..., которая во второй строке, не должно быть ни одного пробела и только один [Tab]. Иначе сборщик не заметит эту строку и конфигурация не пройдет. Первый признак ошибки - слишком быстро пробежавший билд, а в пакете не будет ничего кроме директории /usr):

   vi debian/rules
override_dh_auto_configure:
./configure --prefix=/usr
--sbin-path=/usr/sbin/nginx
--conf-path=/etc/nginx/nginx.conf
--http-log-path=/var/log/nginx/access.log
--error-log-path=/var/log/nginx/error.log
--http-client-body-temp-path=/var/lib/nginx/body
--http-proxy-temp-path=/var/lib/nginx/proxy
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi
--http-uwsgi-temp-path=/var/run/nginx/uwsgi
--http-scgi-temp-path=/var/run/nginx/scgi
--pid-path=/var/run/nginx/nginx.pid
--lock-path=/var/lock/nginx.lock
--with-http_gzip_static_module
--with-http_geoip_module 
--with-http_realip_module
--with-http_stub_status_module
--with-poll_module
--with-http_dav_module
--with-debug
--with-http_ssl_module
--with-http_flv_module
--with-cc-opt=' -O2 -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector
--param=ssp-buffer-size=4 -m64'


Установим файлы приложения в сам пакет, а то он пустой получится:

   dh_install


Так как у нас ванильный пакет, а не дебиановский, то у нас изначально нету никакого init-скрипта. Создадим его, перетерев старый (пробел только перед шибэнгом не забудьте стереть):

   tee > debian/init.d.ex


   #! /bin/sh

   ### BEGIN INIT INFO
   # Provides:          nginx
   # Required-Start:    $all
   # Required-Stop:     $all
   # Default-Start:     2 3 4 5
   # Default-Stop:      0 1 6
   # Short-Description: starts the nginx web server
   # Description:       starts nginx using start-stop-daemon
   ### END INIT INFO

   PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
   DAEMON=/usr/sbin/nginx
   NAME=nginx
   DESC=nginx

   test -x $DAEMON || exit 0

   # Include nginx defaults if available
   if [ -f /etc/default/nginx ] ; then
           . /etc/default/nginx
   fi

   set -e

   case "$1" in
     start)
           echo -n "Starting $DESC: "
           start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
                   --exec $DAEMON -- $DAEMON_OPTS || true
           echo "$NAME."
           ;;
     stop)
           echo -n "Stopping $DESC: "
           start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \
                   --exec $DAEMON || true
           echo "$NAME."
           ;;
     restart|force-reload)
           echo -n "Restarting $DESC: "
           start-stop-daemon --stop --quiet --pidfile \
                   /var/run/$NAME.pid --exec $DAEMON || true
           sleep 1
           start-stop-daemon --start --quiet --pidfile \
                   /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS || true
           echo "$NAME."
           ;;
     reload)
         echo -n "Reloading $DESC configuration: "
         start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/$NAME.pid \
             --exec $DAEMON || true
         echo "$NAME."
         ;;
     *)
           N=/etc/init.d/$NAME
           echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
           exit 1
           ;;
   esac

   exit 0

И установим новый init-скрипт:

   dh_installinit


А еще нам нужна инструкция для logrotate как часто ротировать логи Nginx. Создадим файл конфига:

   tee > conf/logrotate
   /var/log/nginx/*.log {
           daily
           missingok
           rotate 16
           compress
           delaycompress
           notifempty
           create 640 root adm
           sharedscripts
           postrotate
                   [ ! -f /var/run/nginx/nginx.pid ] || kill -USR1 `cat /var/run/nginx/nginx.pid`
           endscript
   }

И добавим его в список установленных файлов между 136-й и 137-й строками (перед END):

   vi +136 auto/install
           mkdir '\$(DESTDIR)$NGX_CONF_PREFIX'/logrotate.d
           cp conf/logrotate '\$(DESTDIR)$NGX_CONF_PREFIX'/logrotate.d/nginx


Вот теперь у нас нормально соберется:

   debuild -uc -us


Отходим назад и смотрим:

   ls ../*deb


Можно теперь поставить:

   dpkg -i ../nginx_1.0.8-nsq1-1_amd64.deb