понедельник, 2 января 2012 г.

Сборка PHP-FPM в Deb пакет

Пошаговый мануал по сборке PHP-FPM в Deb пакет


(ОС: Debian GNU/Linux 6.0 amd64, PHP 5.2.17, PHP-FPM 0.5.14)

Устанавливаем пакеты необходимые для работы

apt-get install build-essential dh-make libxml2-dev


Создаем каталог в который будем производить инсталляцию пакета до его сборки в deb пакет

mkdir /tmp/package


Логинимся в систему под обычным пользователем и все дальнейшие действия выполняем из под него. Скачиваем нужную нам версию PHP (в примере это будет PHP версии 5.2.17) и распаковываем ее в домашнем каталоге пользователя, под которым зашли в систему

cd ~
wget http://ru.php.net/distributions/php-5.2.17.tar.gz
tar -xf php-5.2.17.tar.gz


скачиваем PHP-FPM патч для нашей версии PHP, выполняем декомпрессию

wget http://php-fpm.org/downloads/php-5.2.17-fpm-0.5.14.diff.gz
gzip -d php-5.2.17-fpm-0.5.14.diff.gz


проходим в каталог с исходным кодом PHP

cd php-5.2.17


теперь патчим наш PHP патчем PHP-FPM и включаем поддержку FastCGI и собственно PHP-FPM (в ./configure не забываем добавить нужные нам ключи для сборки PHP с необходимыми нам модулями, например поддержка Mysql)

patch -p1 < ../php-5.2.17-fpm-0.5.14.diff
./configure --prefix= --bindir=/usr/bin --sbindir=/usr/sbin --mandir=/usr/share/man --libdir=/usr/lib --includedir=/usr/include --enable-fastcgi --enable-fpm --with-fpm-log=/var/log/php-fpm.log --with-fpm-pid=/var/run/php-fpm.pid --with-mysql --with-zlib --with-config-file-path=/etc


выполняем компиляцию и установку PHP в заранее подготовленный нами каталог /tmp/package. Данный процесс займет некоторое время, зависит от мощности сервера

INSTALL_ROOT=/tmp/package make all install


если все пройдет нормально, то по завершению будет примерно такой вывод

Build complete.
Don't forget to run 'make test'.


Installing PHP SAPI module:       cgi
Installing PHP CGI binary: /tmp/package/usr/bin/
Installing FPM config:            /tmp/package/etc/php-fpm.conf
Installing init.d script:         /tmp/package/sbin/php-fpm
Installing PHP CLI binary:        /tmp/package/usr/bin/
Installing PHP CLI man page:      /tmp/package/usr/share/man/man1/
Installing build environment:     /tmp/package/usr/lib/build/
Installing header files:          /tmp/package/usr/include/php/
Installing helper programs:       /tmp/package/usr/bin/
  program: phpize
  program: php-config
Installing man pages:             /tmp/package/usr/share/man/man1/
  page: phpize.1
  page: php-config.1
Installing PEAR environment:      /tmp/package/usr/lib/php/
[PEAR] Archive_Tar    - installed: 1.3.7
[PEAR] Console_Getopt - installed: 1.2.3
[PEAR] Structures_Graph- installed: 1.0.3
[PEAR] XML_Util       - installed: 1.2.1
warning: pear/PEAR requires package "pear/Archive_Tar" (recommended version 1.3.7)
warning: pear/PEAR requires package "pear/Structures_Graph" (recommended version 1.0.3)
warning: pear/PEAR requires package "pear/Console_Getopt" (recommended version 1.2.3)
warning: pear/PEAR requires package "pear/XML_Util" (recommended version 1.2.1)
[PEAR] PEAR           - installed: 1.9.1
Wrote PEAR system config file at: /tmp/package//etc/pear.conf
You may want to add: /usr/lib/php to your php.ini include_path
Installing PDO headers:          /tmp/package/usr/include/php/ext/pdo/


(в корне каталога /tmp/package удаляем все файлы и каталоги имя которых начинается на точку)


В каталоге /tmp/package создаем подкаталог DEBIAN, в нем файл control с примерно таким содержимым

Package: php-5.2.17-fpm-0.5.14
Architecture: amd64
Depends:
Provides:
Priority:
Version: 5.2.17
Maintainer: nobody
Description: PHP 5.2.17 with PHP-FPM 0.5.14


в этом же каталоге создаем еще один файл c именем preinst (выставляем ему права 775). Этот файл выполняется перед разворачиванием пакета в системе, в нашем случае это простой скрипт, который создаст системного пользователя php-fpm из под которого будет работать PHP-FPM. Выглядит скрипт вот так

#!/bin/sh -e


id php-fpm >/dev/null 2>&1 || addgroup --system php-fpm && \
adduser --system --no-create-home --disabled-password --ingroup php-fpm php-fpm

теперь создаем файл postinst (выставляем ему права 775), это скрипт запускается после разворачивания пакета. Он копирует php-fpm скрипт к init скриптам, делает его исполняемым и прописывает в автозагрузку

#!/bin/sh -e

cp /sbin/php-fpm /etc/init.d/ && \
chmod +x /etc/init.d/php-fpm && \
/usr/sbin/update-rc.d -f php-fpm defaults

и последний файл имеющий отношение к pre, post, rm скриптам Deb пакета это prerm. Он запускается перед удалением пакета из системы, у нас он останавливает PHP-FPM, удаляет системного пользователя php-fpm, убирает php-fpm из автозагрузки и удаляет init скрипт. Как обычно права на него 775

#!/bin/sh -e

/usr/sbin/invoke-rc.d php-fpm stop && \
userdel php-fpm && \
/usr/sbin/update-rc.d -f php-fpm remove && \
rm -f /etc/init.d/php-fpm

В файле /tmp/package/sbin/php-fpm корректируем путь к php-cgi

php_fpm_BIN=/usr/bin/php-cgi


в /tmp/package/etc/php-fpm.conf выставляем пользователя из под которого будет работать PHP-FPM, эту часть конфига:

                        Unix user of processes
                <!--    <value name="user">nobody</value>                               -->

                        Unix group of processes
                <!--    <value name="group">nogroup</value>             -->

меняем на такую:

                        Unix user of processes
                        <value name="user">php-fpm</value>

                        Unix group of processes
                        <value name="group">php-fpm</value>

из под root пользователя меняем владельца и группу для всех файлов в каталоге /tmp/package

chown -R root:root /tmp/package


и из под обычного пользователя выполняем сборку Deb пакета


cd ~
dpkg-deb -b /tmp/package/ php-5.2.17-fpm-0.5.14-amd64.deb


будет аналогичное сообщение

dpkg-deb: building package `php-5.2.17-fpm-0.5.14' in `php-5.2.17-fpm-0.5.14-amd64.deb'.


и в текущем каталоге появится собранный Deb пакет php-5.2.17-fpm-0.5.14-amd64.deb

Теперь из под root пользователя можем установить собранный нами пакет

dpkg -i php-5.2.17-fpm-0.5.14-amd64.deb


(конфигурационный файл php.ini размещаем в каталоге /etc)

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

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