26.02.2012

Сборка PHP в Debian в альтернативную директорию

На просторах Интернета имеется достаточно большое количествео разнообразных мануалов на тему сборки PHP. К сожалению, всех их объединяет одно: все они делаются через make install (читайте: через интимное место). О причинах распыляться не буду, порекомендую лишь статью на Хабре с многоговорящим названием: Хочется взять и расстрелять, или ликбез о том, почему не стоит использовать make install.

В данном мануале я не ограничусь только сборкой одного пакета.Мы соберем все популярные версии и {в}рапперы для него.

Все, что собирается - собирается на Debian Squeeze для FastCGI. Шаг влево/шаг вправо и мануал уже не подходит. Например на Lenny даже близко не так все будет. Я очень рекомендую установить чистенькую свежую систему, чтобы не спотыкаться об пакеты из неродных репозиториев и их разломанными зависимостями.


Начнем с того, что поставим зависимости, которые возможно нам и не понадобятся, но они указаны к стандартному PHP мейнтейнерами:
apt-get install apache2-prefork-dev autoconf automake bison chrpath flex freetds-dev hardening-wrapper libapr1-dev  libbz2-dev libc-client-dev libcurl4-openssl-dev libenchant-dev libevent-dev libexpat1-dev libfreetype6-dev libgcrypt11-dev libgd2-xpm-dev libglib2.0-dev libgmp3-dev libicu-dev libjpeg-dev libkrb5-dev libldap2-dev libmcrypt-dev libmhash-dev libmysqlclient-dev libonig-dev libpam0g-dev libpng12-dev libpq-dev libpspell-dev libqdbm-dev librecode-dev libsasl2-dev libsnmp-dev libsqlite0-dev libsqlite3-dev libt1-dev libtidy-dev libtool libwrap0-dev libxmltok1-dev libxml2-dev libxslt1-dev locales-all mysql-server quilt re2c unixodbc-dev firebird2.1-dev libgdbm-dev libcurl4-openssl-dev libssl-dev  libreadline-dev libedit-dev

Отлично. Теперь поставим утилиту, которой будем собирать пакеты:
apt-get install checkinstall
Конечно эта утилита - детская лопатка для игры в песочнице. Настоящие мейнтейнеры таким не пользуются, но у меня пока не хватает знаний и ума сделать все вообще по высшему пилотажу. Да и quilty нам не особо пока нужен.

Создадим директории для работы над нашими пакетам:
mkdir -p /usr/src/php/php5.2 /usr/src/php/php5.3 /usr/src/php/php5.4 /usr/src/php/php-switcher

Итак перейдем с сборке первого пакета - PHP 5.2

Сборка пакета PHP 5.2 в альтернативную директорию.

Перейдем в директорию для нашего пакета:
/usr/src/php/php5.2

Скачаем его с этой странички.


Теперь переименуем в нормальное имя:
mv mirror php-5.2.17.tar.bz2

Распакуем:
tar xjf php-5.2.17.tar.bz2
И перейдем в директорию:
cd php-5.2.17

Далее конфигурируем. Но внимательно, я буду черным цветом помечать опции специфичные для этой версии (почему mysql везде цветной, объясню позже):
./configure --build=x86_64-linux-gnu --host=x86_64-linux-gnu --sysconfdir=/etc --localstatedir=/var --disable-debug --with-regex=php --disable-rpath --disable-static --with-pic --with-layout=GNU --enable-calendar --enable-sysvsem --enable-sysvshm --enable-sysvmsg --enable-bcmath --with-bz2 --enable-ctype --with-iconv --enable-exif --with-gettext --enable-mbstring --enable-shmop --enable-sockets --enable-wddx --with-libxml-dir=/usr --with-zlib --with-kerberos=/usr --enable-soap --enable-zip --with-mhash=yes --with-tidy=/usr --with-curl=/usr/bin --with-curlwrappers --with-openssl-dir=/usr --with-zlib-dir=/usr --with-xpm-dir=/usr --with-xsl=/usr --with-xmlrpc --with-iconv-dir=/usr --with-snmp=/usr --with-mcrypt=/usr --with-gd --with-jpeg-dir=/usr --with-png-dir=/usr/lib --with-zlib-dir=/usr --with-freetype-dir=/usr --with-imap --with-kerberos --with-imap-ssl --with-readline --with-libedit --without-pear --with-mysql=/usr --with-mysqli=/usr/bin/mysql_config --with-pdo-mysql=/usr --prefix=/opt/php/php5.2 --mandir=/opt/php/php5.2/man --with-exec-dir=/usr/lib/php5/libexec --with-config-file-path=/etc/php5/alt/php5.2 --with-config-file-scan-dir=/etc/php5/alt/php5.2/conf.d --enable-force-cgi-redirect --enable-fastcgi
Возможно будут вылетать ошибки: придется допиливать по месту.



Внимание на пути конфигов: /etc/php5/alt/...
Не бойтесь, что их еще нет. Эти пути будут автоматически созданы при установке одного из собранных нами далее пакетов - php-switcher, который будет содержать рапперы и всякие полезные postinstall-скрипты.


Здесь я прошу обратить внимание на переменную extension_dir в файле scripts/php-config. Именно сюда надо будет складывать дополнительные библиотеки типа Zend Optimizer или прочих.
Кстати спасибо alekciy'ю за эту инфу, которую я так долго искал.

Готово. Теперь компилируем пакет и устанавливаем файлы. Только не в файловую систему, как это делает make install, а в .deb пакет. Поле мейнтейнера только поменяем на свой e-mail:

checkinstall --pkgname php5.2.alt --pkgversion 5.2.17 --maintainer michael.abramovich@nodesquad.com

На определенном этапе спросит описание пакета (short description), которое будет выводиться о пакете, если дать команду dpkg -l. Напишем там что-то незамысловатое:
PHP 5.2 in optional directory.
Нажмем пару раз Enter и процесс побежал. Через 10 минут или более будет собран пакет, который будет лежать в этой же директории.


Сборка пакета PHP 5.3 в альтернативную директорию.

Перейдем в директорию для нашего пакета:

/usr/src/php/php5.3
Скачаем его с этой странички.

Теперь переименуем в нормальное имя:
mv mirror php-5.3.10.tar.bz2

Распакуем:
tar xjf php-5.3.10.tar.bz2
И перейдем в директорию:

cd php-5.3.10

Далее конфигурируем. Но внимательно, я буду черным цветом помечать опции специфичные для этой версии. Кроме того, обратите внимание, что начиная с версии 5.3 у PHP из коробки идет поддержка нативного драйвера mysql-nd, вместо стороннего libmysqlclient:
./configure --build=x86_64-linux-gnu --host=x86_64-linux-gnu --sysconfdir=/etc --localstatedir=/var --disable-debug --with-regex=php --disable-rpath --disable-static --with-pic --with-layout=GNU --enable-calendar --enable-sysvsem --enable-sysvshm --enable-sysvmsg --enable-bcmath --with-bz2 --enable-ctype --with-iconv --enable-exif --with-gettext --enable-mbstring --enable-shmop --enable-sockets --enable-wddx --with-libxml-dir=/usr --with-zlib --with-kerberos=/usr --enable-soap --enable-zip --with-mhash=yes --with-tidy=/usr --with-curl=/usr/bin --with-curlwrappers --with-openssl-dir=/usr --with-zlib-dir=/usr --with-xpm-dir=/usr --with-xsl=/usr --with-xmlrpc --with-iconv-dir=/usr --with-snmp=/usr --with-mcrypt=/usr --with-gd --with-jpeg-dir=/usr --with-png-dir=/usr/lib --with-zlib-dir=/usr --with-freetype-dir=/usr --with-imap --with-kerberos --with-imap-ssl --with-readline --with-libedit --without-pear --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --prefix=/opt/php/php5.3 --mandir=/opt/php/php5.3/man --with-exec-dir=/usr/lib/php5/libexec --with-config-file-path=/etc/php5/alt/php5.3 --with-config-file-scan-dir=/etc/php5/alt/php5.3/conf.d --with-onig=/usr

Готово. Теперь компилируем пакет и устанавливаем файлы. Поле мейнтейнера только поменяем на свой e-mail:

checkinstall --pkgname php5.3.alt --pkgversion 5.3.10 --maintainer michael.abramovich@nodesquad.com

Short description:
PHP 5.3 in optional directory.

Жмеме Enter два раза, ждем...
Получаем .deb пакет в той же директории.



Сборка пакета PHP 5.4 в альтернативную директорию.


Перейдем в директорию для нашего пакета:

/usr/src/php/php5.4
Скачаем его с этой странички.


Теперь переименуем в нормальное имя:
mv mirror php-5.4.0.tar.bz2
Распакуем:
tar xjf php-5.4.0.tar.bz2
И перейдем в директорию:

cd php-5.4.0
Далее конфигурируем. Но внимательно, я буду черным цветом помечать опции специфичные для этой версии:

./configure --build=x86_64-linux-gnu --host=x86_64-linux-gnu --sysconfdir=/etc --localstatedir=/var --disable-debug --with-regex=php --disable-rpath --disable-static --with-pic --with-layout=GNU --enable-calendar --enable-sysvsem --enable-sysvshm --enable-sysvmsg --enable-bcmath --with-bz2 --enable-ctype --with-iconv --enable-exif --with-gettext --enable-mbstring --enable-shmop --enable-sockets --enable-wddx --with-libxml-dir=/usr --with-zlib --with-kerberos=/usr --enable-soap --enable-zip --with-mhash=yes --with-tidy=/usr --with-curl=/usr/bin --with-curlwrappers --with-openssl-dir=/usr --with-zlib-dir=/usr --with-xpm-dir=/usr --with-xsl=/usr --with-xmlrpc --with-iconv-dir=/usr --with-snmp=/usr --with-mcrypt=/usr --with-gd --with-jpeg-dir=/usr --with-png-dir=/usr/lib --with-zlib-dir=/usr --with-freetype-dir=/usr --with-imap --with-kerberos --with-imap-ssl --with-readline --with-libedit --without-pear --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --prefix=/opt/php/php5.4 --mandir=/opt/php/php5.4/man --libexecdir=/usr/lib/php5/libexec --with-config-file-path=/etc/php5/alt/php5.4 --with-config-file-scan-dir=/etc/php5/alt/php5.4/conf.d --with-onig=/usr


Готово. Теперь компилируем пакет и устанавливаем файлы. Поле мейнтейнера только поменяем на свой e-mail:

checkinstall --pkgname php5.4.alt --pkgversion 5.4.0 --maintainer michael.abramovich@nodesquad.com
Short description:
PHP 5.4 in optional directory.

Жмеме Enter два раза, ждем...
Получаем .deb пакет в той же директории.


Все пакеты PHP собраны. Но нам понадобится еще один пакет, в котором будут содержаться рапперы и задача копирования основных конфигов дебиановского PHP.
Но внимание: работа этого пакета подразумевает, что рапперы будут общие для всех. А значит каждый пользователь столкнется с пробелмой suexec, который требует, чтобы запускаемый файл был владением того же пользователя. Но это фиксится переработкой suexec.

Сборка пакета PHP-switcher.

Перейдем в директорию для нашего пакета:

cd /usr/src/php/php-switcher
Создадим в ней еще одну директорию и перейдем в нее:
mkdir php-switcher-1.0
cd php-switcher-1.0
Подготовим служебные для сборки пакеты:
dh_make -s --indep --createorig

Удалим все вызовы make:
grep -v makefile debian/rules > debian/rules.new
mv debian/rules.new debian/rules
Убираем quilt:
echo "1.0" > debian/source/format
Удаляем все .ex файлы, так как они нам в нашей примитивной поделке не нужны:
rm debian/*.ex
Создадим 3 или 4 раппера:
echo "#!/opt/php/php5.2/bin/php-cgi" > php5.2
echo "#!/opt/php/php5.3/bin/php-cgi" > php5.3
echo "#!/opt/php/php5.4/bin/php-cgi" > php5.4
ну и на вырост:
echo "#!/opt/php/php6.0/bin/php-cgi" > php6.0
Теперь нам надо сказать файл, в котором будет перечисленно, в какую директорию какой файл совать и совать ли вообще:
tee > debian/install
php5.2 /var/www/php-version
php5.3 /var/www/php-version
php5.4 /var/www/php-version
php6.0 /var/www/php-version
Добавляем необходимые скрипты, которые будут вызваны после установки пакета (мы поправим права на файлы и скопируем php.ini основного дебиановского PHP в собствнные директории каждого из альтернативных пакетов. conf.d оставим пустым - его надо заполнять только по мере надобности):
tee > debian/postinst

#!/bin/bash

/bin/chmod -R 555 /var/www/php-version
mkdir -p /etc/php5/alt/php5.2/conf.d /etc/php5/alt/php5.3/conf.d /etc/php5/alt/php5.4/conf.d /etc/php5/alt/php6.0/conf.d
cp /etc/php5/cgi/php.ini /etc/php5/alt/php5.2/php.ini
cp /etc/php5/cgi/php.ini /etc/php5/alt/php5.3/php.ini
cp /etc/php5/cgi/php.ini /etc/php5/alt/php5.4/php.ini
cp /etc/php5/cgi/php.ini /etc/php5/alt/php6.0/php.ini
Стартуем сборку пакета:
debuild -us -uc

По окончании сборки в директории выше, а не как раньше в той же, образуется .deb пакет.

Ставим все 4 пакета и проводим эксперимент.


Проведение эксперимента.

У нас есть две опции: делать один раппер на весь аккаунт пользователя или на каждый сайт отдельно.










Комментариев нет:

Отправить комментарий