Как использовать несколько версий PHP (PHP-FPM и FastCGI) с ISPConfig 3 (Debian Wheezy)
Кратко: руководство по сборке и подключению нескольких версий PHP (на примере PHP 5.3.22 и 5.4.12) как PHP-FPM и FastCGI на Debian Wheezy и последующей регистрации версии в ISPConfig 3.0.5. Описаны сборка из исходников, установка расширений (APC, memcache, memcached, ionCube), создание init-скрипта и добавление версии в ISPConfig.
Важно: приведённые команды требуют root/администраторских прав. Проверяйте порты и пути, чтобы не перезаписывать системный PHP.
Введение
С версии ISPConfig 3.0.5 появилась возможность использовать несколько версий PHP на одном сервере и выбирать оптимальную версию PHP для каждого сайта. Функция работает с PHP-FPM (начиная с PHP 5.3) и FastCGI (всеми версиями PHP 5.x). В этом руководстве показано, как собрать PHP 5.3 и PHP 5.4 в вариантах PHP-FPM и FastCGI на сервере Debian Wheezy. Эти версии PHP можно использовать одновременно с системным PHP, установленным через apt.
Отказ от гарантии: я не даю гарантии, что этот процесс сработает на вашей системе — всегда делайте резервные копии и тестируйте на стенде.
Что будет в руководстве
- Сборка PHP 5.3.22 с поддержкой PHP-FPM
- Настройка init-скрипта, запуск и перезагрузка PHP-FPM
- Установка модулей APC, memcache, memcached и ionCube Loader
- Добавление новой версии в ISPConfig 3.0.5
- Альтернативы, возможные проблемы и контрольный список администратора
1 Предварительное замечание
В примерах я собираю PHP 5.3.22 и PHP 5.4.12 — актуальные версии в момент написания оригинала. Я также покажу, как собрать дополнительные расширения: APC, memcache, memcached и ionCube.
Обратите внимание: PHP-FPM можно использовать и с Apache, и с nginx, в то время как FastCGI доступен только для Apache.
PHP-FPM и FastCGI взаимно исключают друг друга в конфигурациях сборки для PHP 5.3/5.4, поэтому в руководстве показаны две стратегии: сборка с –enable-fpm и сборка с –enable-cgi. При необходимости можно скомпилировать PHP дважды, указав разные каталоги установки (например, /opt/php-5.3.22 для PHP-FPM и /opt/phpfcgi-5.3.22 для FastCGI).
2 Сборка PHP 5.3.22 (PHP-FPM)
Скачайте и распакуйте PHP 5.3.22:
mkdir /opt/php-5.3.22
mkdir /usr/local/src/php5-build
cd /usr/local/src/php5-build
wget http://de.php.net/get/php-5.3.22.tar.bz2/from/this/mirror -O php-5.3.22.tar.bz2
tar jxf php-5.3.22.tar.bz2cd php-5.3.22/Установите зависимости для сборки PHP:
apt-get install build-essential apt-get build-dep php5apt-get install libfcgi-dev libfcgi0ldbl libjpeg62-dbg libmcrypt-dev libssl-dev libc-client2007e libc-client2007e-devСоздайте символьную ссылку, необходимую при сборке с –with-imap:
ln -s /usr/lib/libc-client.a /usr/lib/x86_64-linux-gnu/libc-client.a(Последняя команда нужна, если вы собираете PHP с –with-imap, иначе ./configure остановится с ошибкой поиска libc-client.a.)
Сконфигурируйте и соберите PHP 5.3.22. Вы можете вручную корректировать параметры ./configure под ваши требования; при изменении параметров могут потребоваться дополнительные библиотеки.
./configure --prefix=/opt/php-5.3.22 \
--with-pdo-pgsql \
--with-zlib-dir \
--with-freetype-dir \
--enable-mbstring \
--with-libxml-dir=/usr \
--enable-soap \
--enable-calendar \
--with-curl \
--with-mcrypt \
--with-zlib \
--with-gd \
--with-pgsql \
--disable-rpath \
--enable-inline-optimization \
--with-bz2 \
--with-zlib \
--enable-sockets \
--enable-sysvsem \
--enable-sysvshm \
--enable-pcntl \
--enable-mbregex \
--enable-exif \
--enable-bcmath \
--with-mhash \
--enable-zip \
--with-pcre-regex \
--with-mysql \
--with-pdo-mysql \
--with-mysqli \
--with-jpeg-dir=/usr \
--with-png-dir=/usr \
--enable-gd-native-ttf \
--with-openssl \
--with-fpm-user=www-data \
--with-fpm-group=www-data \
--with-libdir=/lib/x86_64-linux-gnu \
--enable-ftp \
--with-imap \
--with-imap-ssl \
--with-kerberos \
--with-gettext \
--with-xmlrpc \
--with-xsl \
--enable-fpm
make
make installПоследний ключ –enable-fpm обеспечивает совместимость этой сборки с PHP-FPM.
Скопируйте php.ini и конфигурацию php-fpm в правильные места:
cp /usr/local/src/php5-build/php-5.3.22/php.ini-production /opt/php-5.3.22/lib/php.inicp /opt/php-5.3.22/etc/php-fpm.conf.default /opt/php-5.3.22/etc/php-fpm.confОткройте /opt/php-5.3.22/etc/php-fpm.conf и отредактируйте следующие параметры. В поле listen укажите свободный порт (например, 8999; 9000 может быть занят системным PHP-FPM). В конце файла добавьте include=/opt/php-5.3.22/etc/pool.d/*.conf:
vi /opt/php-5.3.22/etc/php-fpm.conf| [...] pid = run/php-fpm.pid [...] user = www-data group = www-data [...] listen = 127.0.0.1:8999 [...] include=/opt/php-5.3.22/etc/pool.d/*.conf |
Создайте директорию для пулов процессов PHP-FPM:
mkdir /opt/php-5.3.22/etc/pool.dСоздайте init-скрипт для управления службой PHP-FPM:
vi /etc/init.d/php-5.3.22-fpm| #! /bin/sh ### BEGIN INIT INFO # Provides: php-5.3.22-fpm # Required-Start: $all # Required-Stop: $all # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: starts php-5.3.22-fpm # Description: starts the PHP FastCGI Process Manager daemon ### END INIT INFO php_fpm_BIN=/opt/php-5.3.22/sbin/php-fpm php_fpm_CONF=/opt/php-5.3.22/etc/php-fpm.conf php_fpm_PID=/opt/php-5.3.22/var/run/php-fpm.pid php_opts="--fpm-config $php_fpm_CONF" wait_for_pid () { try=0 while test $try -lt 35 ; do case "$1" in 'created') if [ -f "$2" ] ; then try='' break fi ;; 'removed') if [ ! -f "$2" ] ; then try='' break fi ;; esac echo -n . try=`expr $try + 1` sleep 1 done } case "$1" in start) echo -n "Starting php-fpm " $php_fpm_BIN $php_opts if [ "$?" != 0 ] ; then echo " failed" exit 1 fi wait_for_pid created $php_fpm_PID if [ -n "$try" ] ; then echo " failed" exit 1 else echo " done" fi ;; stop) echo -n "Gracefully shutting down php-fpm " if [ ! -r $php_fpm_PID ] ; then echo "warning, no pid file found - php-fpm is not running ?" exit 1 fi kill -QUIT `cat $php_fpm_PID` wait_for_pid removed $php_fpm_PID if [ -n "$try" ] ; then echo " failed. Use force-exit" exit 1 else echo " done" echo " done" fi ;; force-quit) echo -n "Terminating php-fpm " if [ ! -r $php_fpm_PID ] ; then echo "warning, no pid file found - php-fpm is not running ?" exit 1 fi kill -TERM `cat $php_fpm_PID` wait_for_pid removed $php_fpm_PID if [ -n "$try" ] ; then echo " failed" exit 1 else echo " done" fi ;; restart) $0 stop $0 start ;; reload) echo -n "Reload service php-fpm " if [ ! -r $php_fpm_PID ] ; then echo "warning, no pid file found - php-fpm is not running ?" exit 1 fi kill -USR2 `cat $php_fpm_PID` echo " done" ;; *) echo "Usage: $0 {start|stop|force-quit|restart|reload}" exit 1 ;; esac |
Сделайте init-скрипт исполняемым и создайте ссылки автозагрузки:
chmod 755 /etc/init.d/php-5.3.22-fpm
insserv php-5.3.22-fpmЗапустите PHP-FPM:
/etc/init.d/php-5.3.22-fpm startЕсли в /opt/php-5.3.22/etc/pool.d ещё нет пулов, вы увидите предупреждение, которое можно игнорировать:
root@server1:/usr/local/src/php5-build/php-5.3.22# /etc/init.d/php-5.3.22-fpm start
Starting php-fpm [04-Mar-2013 14:58:41] WARNING: Nothing matches the include pattern '/opt/php-5.3.22/etc/pool.d/*.conf' from /opt/php-5.3.22/etc/php-fpm.conf at line 512.
done
root@server1:/usr/local/src/php5-build/php-5.3.22#Теперь вы можете установить дополнительные модули, такие как APC, memcache, memcached и ionCube.
3 Установка расширений: APC, memcache, memcached, ionCube
APC, memcache и memcached можно установить через PEAR/PECL. Для начала установите и инициализируйте PEAR:
apt-get -y install php-pearcd /opt/php-5.3.22/etcpecl -C ./pear.conf update-channelsУстановка APC:
pecl -C ./pear.conf install apcПримите значения по умолчанию. Затем откройте /opt/php-5.3.22/lib/php.ini и добавьте:
vi /opt/php-5.3.22/lib/php.ini| [...] extension=apc.so apc.enabled=1 apc.shm_size=128M apc.ttl=0 apc.user_ttl=600 apc.gc_ttl=600 apc.enable_cli=1 apc.mmap_file_mask=/tmp/apc.XXXXXX ;apc.mmap_file_mask=/dev/zero ;apc.shm_segments = 5 |
Установка memcache:
pecl -C ./pear.conf install memcacheДобавьте в php.ini:
| [...] extension=memcache.so |
Установка memcached (требует libmemcached-dev):
apt-get install libmemcached-devpecl -C ./pear.conf install memcachedДобавьте в php.ini:
| [...] extension=memcached.so |
Установка ionCube Loader:
cd /tmpСкачайте и распакуйте пакет ionCube для вашей архитектуры (x86_64 или x86).
Для x86_64:
wget http://downloads2.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz
tar xfvz ioncube_loaders_lin_x86-64.tar.gzДля x86:
wget http://downloads2.ioncube.com/loader_downloads/ioncube_loaders_lin_x86.tar.gz
tar xfvz ioncube_loaders_lin_x86.tar.gzСкопируйте загрузчик и правьте php.ini:
cp ioncube/ioncube_loader_lin_5.3.so /opt/php-5.3.22/lib/php/extensions/no-debug-non-zts-20090626/ioncube.so
vi /opt/php-5.3.22/lib/php.iniДобавьте строку zend_extension в начало файла (до строки [PHP]):
| zend_extension = /opt/php-5.3.22/lib/php/extensions/no-debug-non-zts-20090626/ioncube.so [PHP] [...] |
Перезагрузите PHP-FPM:
/etc/init.d/php-5.3.22-fpm reload4 Добавление версии PHP в ISPConfig 3.0.5
В ISPConfig 3.0.5 новую версию PHP можно настроить в System > Additional PHP Versions. На вкладке Name укажите имя версии (например, PHP 5.3.22) — оно будет отображаться в настройках сайта в ISPConfig.

Перейдите на вкладку PHP-FPM Settings (вкладку FastCGI Settings можно оставить пустой) и заполните поля следующим образом:

Примечание: изображения выше показывают пример полей, которые нужно заполнить. Важно указать корректный путь до php-fpm и адрес/порт для соединения (например, 127.0.0.1:8999).
Практические советы и наиболее частые ошибки
Важно:
- Всегда проверяйте, что порт, который вы указываете в listen, свободен и не конфликтует с системными службами.
- Перед копированием в production тестируйте сборку и конфигурацию на тестовом сервере.
- Следите за правами доступа к каталогам /opt и к исполняемым файлам — служба должна запускаться от пользователя www-data (или другого, указанного вами).
Распространённые причины неудачной сборки или запуска:
- Отсутствие dev-пакетов нужных библиотек (openssl-dev, libxml2-dev и т.д.).
- Неправильные пути в ./configure (особенно для 64-битных систем — libdir).
- Конфликт портов или отсутствие прав на запись в var/run.
Альтернативные подходы
Использовать пакеты из репозиториев (если доступны) или сторонние репозитории (например, dotdeb) — это уменьшит трудоёмкость поддержки, но даст меньше гибкости.
Контейнеризация: запуск разных версий PHP в Docker-контейнерах и связывание их с веб-сервером (nginx) — хорошая изоляция и простота отката, но требует навыков работы с контейнерами.
Использовать system-wide менеджеры версий (phpbrew) — удобны для сборки и тестирования, но потребуют адаптации для интеграции с ISPConfig.
Когда не стоит собирать PHP из исходников:
- Если у вас ограниченный опыт администрирования и нет тестовой среды.
- Если вам нужен простой автоподдерживаемый стек с минимальными усилиями по обновлению.
Мини-методология (шаги для повторяемой сборки)
- Подготовить чистую тестовую среду (VM или контейнер).
- Установить все build-deps через apt-get build-dep php5 и дополнительные dev-пакеты.
- Скачать исходники, распаковать, настроить ./configure.
- make; make install в префикс /opt/php-<версия>.
- Настроить php.ini и php-fpm.conf (указать уникальный listen и создать пул).
- Создать init-скрипт, добавить в автозагрузку.
- Установить и проверить расширения через pecl/копирование ionCube.
- Зарегистрировать версию в ISPConfig и протестировать на реальном сайте.
Контрольный список администратора
- Есть резервная копия сервера/VM.
- Подготовлена тестовая среда.
- Проверены свободные порты (например, 8999).
- Все необходимые dev-пакеты установлены.
- PHP собран в /opt/php-<версия> без ошибок.
- php.ini и php-fpm.conf настроены.
- init-скрипт работает: start/stop/reload.
- Установлены необходимые расширения (APC/memcache/ionCube) и активированы в php.ini.
- Версия добавлена в ISPConfig и сайт успешно использует выбранную версию PHP.
Критерии приёмки
- Процесс сборки завершился без ошибок.
- PHP-FPM запускается и слушает указанный порт или сокет.
- phpinfo() отображает корректную версию PHP и загруженные расширения.
- Сайты в ISPConfig могут переключаться на новую версию PHP и корректно обслуживаются.
Краткий глоссарий
- PHP-FPM: FastCGI Process Manager для PHP — 관리ваюший пул процессов PHP.
- FastCGI: механизм запуска PHP как отдельного процесса, интегрируется с Apache через mod_fcgid или mod_fastcgi.
- PECL/PEAR: менеджеры пакетов для расширений PHP.
- ionCube: проприетарный загрузчик, необходимый для защищённого PHP-кода.
Когда это не сработает (примеры)
- На сильно модифицированных дистрибутивах с другой структурой библиотечных директорий (потребуются дополнительные правки).
- Если целевой сервер использует SELinux с жёсткой политикой, потребуется корректировка правил.
- При смешении 32/64-битных библиотек могут возникнуть ошибки загрузки модулей.
Резюме
Это руководство показывает подробную процедуру сборки PHP 5.3.22 с поддержкой PHP-FPM, настройки служб и интеграции с ISPConfig 3.0.5, а также установку часто используемых расширений. Для production-систем рекомендуется тестирование в отдельной среде и документирование каждого шага.
Сводка действий:
- Собрать PHP в отдельный префикс (/opt/php-<версия>).
- Настроить php-fpm.conf и пул.
- Создать init-скрипт и добавить автозагрузку.
- Установить расширения через PECL и ionCube вручную.
- Добавить версию в ISPConfig и протестировать переключение версий.
Дополнительные ресурсы и практические советы помогут избежать типичных ошибок при сборке и развертывании.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента