Rose debug info
---------------

Мультиверсионность php на сервере с VestaCP.

Можно использовать скрипт который упрощает установку разных версий php
Сделаем возможность использовать несколько разных версий php на одном сервере c Ubuntu 14.04 и VestaCP. Возможность переключать версию php будет для каждого сайта отдельно. По умолчанию в ubuntu 14.04.4 с вестой установился php 5.5.

Все действия производятся под root’ом.
Соберем старый php 5.4.
Установим необходимые пакеты.

apt-get build-dep -y php5
apt-get install libt1-dev libonig-dev libmcrypt-dev libreadline-dev

Создаем каталог для исходников

mkdir /php/
mkdir /php/src

Скачиваем туда сорцы с http://php.net.

wget -O /php/src/php-5.4.45.tar.bz2 http://de1.php.net/get/php-5.4.45.tar.bz2/from/this/mirror
cd /php/src/
tar -xjf php-5.4.45.tar.bz2
cd php-5.4.45

И создаем каталог куда будем собирать php

mkdir /php/php54

Конфигурим(обратите внимание на переменную —prefix=, она указывает на каталог куда собираем php)

./configure \
--prefix=/php/php54 \
--with-config-file-path=/etc \
--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-cdb \
--with-iconv \
--enable-exif \
--enable-ftp \
--with-gettext \
--enable-mbstring \
--with-onig=/usr \
--with-pcre-regex=/usr \
--enable-shmop \
--enable-sockets \
--enable-wddx \
--with-libxml-dir=/usr \
--with-zlib \
--with-kerberos=/usr \
--with-openssl=/usr \
--enable-soap \
--enable-zip \
--with-mhash=yes \
--with-mysql-sock=/var/run/mysqld/mysqld.sock \
--with-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--enable-pdo \
--with-pdo-mysql=mysqlnd \
--enable-exif \
--with-jpeg-dir=/usr \
--with-png-dir=/usr \
--with-freetype-dir=/usr \
--with-t1lib \
--with-zlib-dir=/usr \
--with-mcrypt=/usr \
--with-mhash \
--with-xsl=/usr \
--enable-zip \
--enable-cgi \
--with-curl \
--with-gd \
--enable-pcntl \
--enable-mbregex \
--enable-gd-native-ttf \
--with-libdir=lib64 \
--enable-dba=shared \
--enable-intl \
--with-readline=/usr \
--enable-simplexml \
--with-libdir=/lib/x86_64-linux-gnu \
--with-config-file-scan-dir="$instdir"/etc \
--with-pspell

Компиляем

make
make install

Включаем модуль cgi для апача

a2enmod cgi

Переключать будем шаблонами apache. Скопируем существующий шаблон phpcgi

cp /usr/local/vesta/data/templates/web/apache2/phpcgi.sh /usr/local/vesta/data/templates/web/apache2/php54.sh
cp /usr/local/vesta/data/templates/web/apache2/phpcgi.stpl /usr/local/vesta/data/templates/web/apache2/php54.stpl
cp /usr/local/vesta/data/templates/web/apache2/phpcgi.tpl /usr/local/vesta/data/templates/web/apache2/php54.tpl

Открываем файл /usr/local/vesta/data/templates/web/apache2/php54.sh и находим там строку

wrapper_script='#!/usr/bin/php-cgi -cphp5-cgi.ini'

заменяем на

wrapper_script='#!/php/php54/bin/php-cgi -cphp5-cgi.ini'

И перезапускаем весту

service vesta restart

Теперь если зайти в весте в редактирование домена в web, то в шаблонах апача можно увидеть новый шаблон php54. Можно попробовать переключится.

Аналогично собираем php 5.6 и php 7.0, в каталоги /php/php56 и /php/php70 соответсвенно. И создаем для них шаблоны php56 и php70. Конфигурирование для php7 несколько отличается от php5. Мои параметры для конфигурирования есть в этой статье.

В результате этих манипуляций у нас появятся новые шаблоны php54, php56 и php70, с соответсвующими версиями php. Теперь для каждого домена мы можем выбрать любую версию php от 5.4 до 7.0. С выходом новых версий их можно добавлять к текущим таким же способом.

Поделиться
Отправить
31 комментарий
Костя 2016

Спасибо тебе огроменное. Только вчера установил ubuntu и VestaCP. Начал искать как побороть проблему (старый скрипт не работал). Не ожидал увидеть реализацию с выбором шаблонов в панели.

Петр Аникин 2016

Пожалуйста. Рад что помог.

анон 2016

И я скажу большое спасибо!

Петр Аникин 2016

И вам пожалуйста.

Максим 2016

У меня не получилось... выдает Internal Server Error

Петр Аникин 2016

Смотрите в логе апача ошибку.

не выходит... 2016

сможете помочь?

Максим 2016

Я новичок, просьба не бить
/php/php54 — папка пустая после всех этих манипуляций
как понимаю туда должен был стать php 5.4...

Петр Аникин 2016

В скайпе завтра свяжитесь со мной. Ссылка есть вверху страницы слева.

Никита 2016

Будьте добры такую-же статью для Centos 6.x напишите, а то на оф.сайте так и не дождемся из коробки такого функционала. (В идеях эта тема у них есть, но с реализацией не понятно когда всё это сделают )

Петр Аникин 2016

Для центоси собрать из исходников можно аналогично, только там зависимости по другому называются. И ещё насколько я помню там можно репы с разными версиями php подключить. Я посмотрю как лучше в центоси это реализовать и на следующей неделе выкачу статью, раз читатели просят. Ждите в общем.


Добавил для centos http://anikin.pw/all/multiversionnost-na-centos-s-vestacp/

Stas 2016

Спасибо за инструкцию, подскажите пожалуйста, а если подключаешь ioncube модуль, его куда прописывать к этой версии php?

Петр Аникин 2016

В configure измените

--with-config-file-scan-dir=

на дирректрорию куда будете класть конфиги для модулей, например /php/php54/etc/conf.d, затем сможете в этой дирректории создать ioncube.ini в котором укажете пути к ioncube.

Stas 2016

Подскажите, пожалуйста, еще на этапе make вылазит:

cuio -lxml2 -lxml2 -lcrypt -lxml2 -lxml2 -lxml2 -lxml2 -lxslt -lxml2 -lcrypt -o sapi/cgi/php-cgi
/usr/bin/ld: ext/intl/msgformat/.libs/msgformat_helpers.o: undefined reference to symbol ’__gxx_personality_v0@@CXXABI_1.3’
/usr/lib/x86_64-linux-gnu/libstdc++.so.6: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make: *** [sapi/cgi/php-cgi] Error 1

Петр Аникин 2016

Из configure php 5.3 уберите

--enable-intl \
Stas 2016

Спасибо, но теперь появляется такая:

/php/src/php-5.3.29/ext/fileinfo/libmagic/apprentice.c:781:4: warning: passing argument 1 of ‘_php_stream_opendir’ discards ‘const’ qualifier from pointer target type [enabled by default]
dir = php_stream_opendir(fn, REPORT_ERRORS, NULL);
^
In file included from /php/src/php-5.3.29/main/php.h:400:0,
from /php/src/php-5.3.29/ext/fileinfo/libmagic/apprentice.c:32:
/php/src/php-5.3.29/main/php_streams.h:339:20: note: expected ‘char *’ but argument is of type ‘const char *’
PHPAPI php_stream *_php_stream_opendir(char *path, int options, php_stream_context *context STREAMS_DC TSRMLS_DC);
^
virtual memory exhausted: Cannot allocate memory
make: *** [ext/fileinfo/libmagic/apprentice.lo] Error 1

Петр Аникин 2016

Память похоже кончилась. Создайте swap-файл перед сборкой чтобы разгрузить ОЗУ во время компиляции или увеличивайте память.

Stas 2016

Ох, спасибо, остановил apache и mysql на время сборки, благо сервер позволяет такое.

Смотрите, я прописал в конфиг при сборке параметр:

—with-config-file-scan-dir=/php/php54/etc/conf.d \

Затем создал собственно саму директорию и файл /php/php54/etc/conf.d/ioncube.ini, прописав туда:

zend_extension = /php/php54/lib/php/ioncube_loader_lin_5.3.so

Но ioncube так и не подцепился. Подскажите, что я сделал не так?

Stas 2016

Все, разобрался, как всегда ошибка с прописыванием директории где лежит модуль ;)
Огромное вам спасибо за помощь!

Петр Аникин 2016

Только что хотел вам написать что у вас скорее всего путаница с путями. Рад что у вас получилось. Пожалуйста.

Stas 2016

Еще один вопрос, где у этой версии php файл php.ini? Или он параметры из основой версии берет?

Петр Аникин 2016

Основной php.ini там где вы его укажете при конфигурировании переменной

--with-config-file-path=

Также php-cgi позволяет задать пользовательский php.ini имеющий приоритет перед основным.

Денис 2016

Иногда требуется древняя версия но собрать её не всегда получается с 1 раза
да ещё Vesta 16 имеет баг в переключении версий «портит конфиги и после не стартует httpd»
так что для экспериментов настраивайте на 15

«Установка PHP 5.2.17 на VestaCP 15 (Centos 7 x86_64)»

Пункт 1 необязателен, если у вас уже установлены необходимые инструменты для компилирования php
1. Предварительно устанавливаем набор пакетов для разработки
yum groupinstall ’Development Tools’
2. • Создаем папку где будут находиться бинарные файлы
mkdir /opt/php-5.2
3. • Создаем папку для загрузки исходников и переходим в нее
mkdir -p /usr/src/php/ && cd /usr/src/php/
• Скачиваем архив с исходниками php 5.2 с http://museum.php.net/php5/
wget -c -t0 http://museum.php.net/php5/php-5.2.17.tar.gz
4. • Распаковываем архив
tar zxf php-5.2.17.tar.gz
5. • Переходим в папку с исходниками
cd /usr/src/php/php-5.2.17
• Скачиваем и применяем патч безопасности
wget http://php52-backports.googlecode.com/files/php52-backports-20130717.patch
patch -p1 < php52-backports-20130717.patch
6. yum install \
libxml2-dev* \
libmhash-dev* \
libcurl-dev* \
libpng* —skip-broken \
libjpeg* \
libtidy-dev* \
libxslt-dev* \
libtool-ltdl-dev* \
mcrypt \
libmcrypt-dev* \
libXpm-dev* \
libsqlite* \
mysql-dev* \
mysql-libs \
sqlite-dev* \
freetype-dev* \
openssl-dev* \
bzip2-dev* \
unzip* \
patch \
make \
gcc-x86_64*

./configure \
—prefix=/opt/php-5.2 \
—with-config-file-path=/opt/php-5.2\
—with-libdir=lib64 \
—with-mysql \
—with-mysqli \
—with-sqlite \
with-pdo-mysql \ with-pdo-sqlite \
—with-curl \
—with-gd \
—with-openssl \
—with-mcrypt \
—with-pear \
—with-pic \
—with-jpeg-dir \
—with-png-dir \
—with-ttf \
—with-freetype-dir \
—with-xmlrpc \
—with-xpm-dir \
—with-zlib \
—enable-bcmath \
—enable-calendar \
—enable-cli \
—enable-discard-path \
—enable-fastcgi \
—enable-ftp \
—enable-force-cgi-redirect \
—enable-gd-native-ttf \
—enable-libxml \
—enable-mbstring \
—enable-pdo \
—enable-soap \
—enable-sockets \
—enable-session \
—enable-zip \
—enable-zend-multibyte
• Компилируем и устанавливаем
make
make install
• Копируем php.ini
cp /usr/src/php/php-5.2.17/php.ini-recommended /opt/php-5.2/lib/php.ini
• Делаем пробный запуск свежеустановленной версии
/opt/php-5.2/bin/php-cgi -v

в шаблонах меняем

Открываем файл /usr/local/vesta/data/templates/web/httpd/phpfcgi52.sh и находим там строку
PHPRC=/usr/local/lib
exec /usr/bin/php-cgi
заменяем на

PHPRC=/opt/php5.2/local/lib/php/
exec /opt/php5.2/bin/php-cgi

Сергей 2016

На одном сервере собрал все по инструкции. Работает безупречно.
Решил добавить PHP 5.3.29 на второй сервер.
Постоянно получаю «The requested URL /cgi-bin/php/index.php was not found on this server.»
Конфигурация серверов идентичная, Debian 7.11 x64

Петр Аникин 2016

Значит чем-то все же отличается. Возможно вы забыли включить модуль cgi в апаче.

Андрей 2018

Ещё раз про php.ini для версии. Не подтягиваются настройки из общих настроек сервера. В конфиге версии указан путь configure_options=» ’prefix=/opt/php/php-5.3.20’ ’with-config-file-path=/opt/php/php-5.3.20/etc’, создал там отдельный php.ini, но и так не работает — непонятно откуда берёт, например стандартные upload_max_filesize:
2M. Подскажите, пожалуйста где ещё копнуть?

Дмитрий 2018

Приветствую! И я столкнулся с проблемой, не находит php 7 конфигурационный файл php.ini(Loaded Configuration File (none) ). Пробовал размещать в папке etc и прочиз — не видит. Как понимаю, надо было при установке указать —with-config-file-path=, но как это исправить когда уже все необходимое установлено?
Спасибо

Петр Аникин 2018

Пересобрать с нужным параметром.

Дмитрий 2018

Написал немного не туда, я использовал ваш скрипт для установки мульти пхп. Не подскажите, как с ним это исполнить?

Дмитрий 2018

Тоесть, у меня щас ситуация как на картинке поста
Configuration File (php.ini) Path /opt/php/php-7.1.4/etc
Loaded Configuration File (none)
Хотя файл php.ini в данной категории создал.

Demon 2018

Овчинка выделки, кроме админа все равно ни кто не сможет воспользоваться этим функционалом, однопользовательская панель (

Петр Аникин 2018

Переключений версий php доступно пользователям в редактировании домена.

Demon 2018

Петр Аникин, Вы заблуждаетесь, видимо ни когда под пользователем не работали.
1) Выйти из админа;
2) залогиниться обычным юзером;
3) убедиться что настрокйки (шаблоны) web ни кому не доступны.
ПС: установить нормальную панель для юзеров.

Петр Аникин 2018

Заблуждаетесь тут вы. У нас все пользователи прекрасно меняют шаблоны web и выбирают себе версию php. Доступ к админской учетке не нужен чтобы настраивать свои домены.
Какую например «нормальную панель для юзеров» вы предлагаете?

Demon 2018

)) Петр, а Вы точно уверены? на 100%?
Покажите хотя бы, у меня 5 серверов и ни на одном такого нет!
На формуе официально дали понять, что такого нет и не планируется.
https://forum.vestacp.com/viewtopic.php?f=35&t=11203
Официально это работать не должно, по дефолту.

Хотя бы ссылку на ютуб, но не забывайте, именно под юзером залогиниться сразу, без предварительного входа как админ!

Касательно «нормальной» — лично для меня это DA, 300$ за вечную, лучше ничего не видел, любая коммерческая, в том числе ISPmgr, будет функциональней vestacp, хотя и критиковал ее в последних релизах. СP — нее, Parallels — нее, но это личная неприязнь самой конторы.

Demon 2018

Юзер онли
http://prntscr.com/k9qcx5

Админ —> Юзер
http://prntscr.com/k9qdg9

Роман 2018

Установил php 7.1 при помощи скрипта. В весте выбираю шаблон для домена в WEB php7.1 делаю рестарт апача, все равно выдает версию 7.0 которая была по умолчанию в ubuntu 16.04. Что нужно сделать чтобы выбрать 7.1?

Demon 2018

Роман, может напутали с путями, и кстати, проверте от «юзера» кому установили шаблон новой версии PHP, версию php в CLI, скорее всего будет именно дефолтная, так как шаблоны устанавливает только для скриптов а не для CLI. Но некоторые (многие), особенно микрофреймворки используют именно CLI, на ISPmgr это лечится ровно так же как и на vestacp.

Эдгар 2020

Добрый день, помогите плиз , поставил еще на серв 7.0 и 7.2.
создал темплейт под них, не могу понять как исправить строку в
wrapper_script=’#!/usr/bin/php-cgi -cphp5-cgi.ini’

поставил с помощью yum install rh-php70

как правильно прописать wrapper_script?

Петр Аникин 2020

Вместо /usr/bin/php-cgi должен быть путь к бинарнику php-cgi вашей версии php.

Эдгар 2020

это я понял, а второе -cphp5-cgi.ini что сюда?

Петр Аникин 2020

Это ini файл откуда настройки php подсасываются. Оставьте как есть.

Роман 2020

Никак не получается побороть php.ini настройки для шаблона. Не подгружает файл настроек. Хотя в указанной в phpinfo папке файл php.ini создавал. Как сделать правильно, чтобы подхватывались настройки для шаблона. Может кто-нибудь пошагово расписать у кого получилось побороть это?

Роман 2020

Похоже поборол проблему выше) создал файл php.ini в папке /opt/php/php-7.1.33/etc/conf.d и подцепились настройки.

Челодрык 2020

make: *** No targets specified and no makefile found. Stop.
Выбивает, как скомпливеть?

Петр Аникин 2020

Отсутствует makefile. ./configure ошибкой завершился.

Сергей 2020

В данной теме устанавливают 6 версий php
[удалено]

Петр Аникин 2020

Все версии устанавливаются аналогично. Нет смысла повторяться. Ссылки удаляю.

Фильмослив 2021

проблема такая, установил пхп несколько версий, всё отлично работает, НО .... в версии пхп по умолчанию есть файл php.ini, а в установленных нету. ДЫК) как настраивать тот же мемори лимит?