Мультиверсионность 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. С выходом новых версий их можно добавлять к текущим таким же способом.
Спасибо тебе огроменное. Только вчера установил ubuntu и VestaCP. Начал искать как побороть проблему (старый скрипт не работал). Не ожидал увидеть реализацию с выбором шаблонов в панели.
Пожалуйста. Рад что помог.
И я скажу большое спасибо!
И вам пожалуйста.
У меня не получилось... выдает Internal Server Error
Смотрите в логе апача ошибку.
сможете помочь?
Я новичок, просьба не бить
/php/php54 — папка пустая после всех этих манипуляций
как понимаю туда должен был стать php 5.4...
В скайпе завтра свяжитесь со мной. Ссылка есть вверху страницы слева.
Будьте добры такую-же статью для Centos 6.x напишите, а то на оф.сайте так и не дождемся из коробки такого функционала. (В идеях эта тема у них есть, но с реализацией не понятно когда всё это сделают )
Для центоси собрать из исходников можно аналогично, только там зависимости по другому называются. И ещё насколько я помню там можно репы с разными версиями php подключить. Я посмотрю как лучше в центоси это реализовать и на следующей неделе выкачу статью, раз читатели просят. Ждите в общем.
Добавил для centos http://anikin.pw/all/multiversionnost-na-centos-s-vestacp/
Спасибо за инструкцию, подскажите пожалуйста, а если подключаешь ioncube модуль, его куда прописывать к этой версии php?
В configure измените
на дирректрорию куда будете класть конфиги для модулей, например /php/php54/etc/conf.d, затем сможете в этой дирректории создать ioncube.ini в котором укажете пути к ioncube.
Подскажите, пожалуйста, еще на этапе 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
Из configure php 5.3 уберите
Спасибо, но теперь появляется такая:
/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
Память похоже кончилась. Создайте swap-файл перед сборкой чтобы разгрузить ОЗУ во время компиляции или увеличивайте память.
Ох, спасибо, остановил 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 так и не подцепился. Подскажите, что я сделал не так?
Все, разобрался, как всегда ошибка с прописыванием директории где лежит модуль ;)
Огромное вам спасибо за помощь!
Только что хотел вам написать что у вас скорее всего путаница с путями. Рад что у вас получилось. Пожалуйста.
Еще один вопрос, где у этой версии php файл php.ini? Или он параметры из основой версии берет?
Основной php.ini там где вы его укажете при конфигурировании переменной
Также php-cgi позволяет задать пользовательский php.ini имеющий приоритет перед основным.
Иногда требуется древняя версия но собрать её не всегда получается с 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
На одном сервере собрал все по инструкции. Работает безупречно.
Решил добавить PHP 5.3.29 на второй сервер.
Постоянно получаю «The requested URL /cgi-bin/php/index.php was not found on this server.»
Конфигурация серверов идентичная, Debian 7.11 x64
Значит чем-то все же отличается. Возможно вы забыли включить модуль cgi в апаче.
Ещё раз про 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. Подскажите, пожалуйста где ещё копнуть?
http://php.net/manual/ru/function.phpinfo.php
Приветствую! И я столкнулся с проблемой, не находит php 7 конфигурационный файл php.ini(Loaded Configuration File (none) ). Пробовал размещать в папке etc и прочиз — не видит. Как понимаю, надо было при установке указать —with-config-file-path=, но как это исправить когда уже все необходимое установлено?
Спасибо
Пересобрать с нужным параметром.
Написал немного не туда, я использовал ваш скрипт для установки мульти пхп. Не подскажите, как с ним это исполнить?
Тоесть, у меня щас ситуация как на картинке поста
Configuration File (php.ini) Path /opt/php/php-7.1.4/etc
Loaded Configuration File (none)
Хотя файл php.ini в данной категории создал.
Овчинка выделки, кроме админа все равно ни кто не сможет воспользоваться этим функционалом, однопользовательская панель (
Переключений версий php доступно пользователям в редактировании домена.
Петр Аникин, Вы заблуждаетесь, видимо ни когда под пользователем не работали.
1) Выйти из админа;
2) залогиниться обычным юзером;
3) убедиться что настрокйки (шаблоны) web ни кому не доступны.
ПС: установить нормальную панель для юзеров.
Заблуждаетесь тут вы. У нас все пользователи прекрасно меняют шаблоны web и выбирают себе версию php. Доступ к админской учетке не нужен чтобы настраивать свои домены.
Какую например «нормальную панель для юзеров» вы предлагаете?
)) Петр, а Вы точно уверены? на 100%?
Покажите хотя бы, у меня 5 серверов и ни на одном такого нет!
На формуе официально дали понять, что такого нет и не планируется.
https://forum.vestacp.com/viewtopic.php?f=35&t=11203
Официально это работать не должно, по дефолту.
Хотя бы ссылку на ютуб, но не забывайте, именно под юзером залогиниться сразу, без предварительного входа как админ!
Касательно «нормальной» — лично для меня это DA, 300$ за вечную, лучше ничего не видел, любая коммерческая, в том числе ISPmgr, будет функциональней vestacp, хотя и критиковал ее в последних релизах. СP — нее, Parallels — нее, но это личная неприязнь самой конторы.
Юзер онли
http://prntscr.com/k9qcx5
Админ —> Юзер
http://prntscr.com/k9qdg9
Установил php 7.1 при помощи скрипта. В весте выбираю шаблон для домена в WEB php7.1 делаю рестарт апача, все равно выдает версию 7.0 которая была по умолчанию в ubuntu 16.04. Что нужно сделать чтобы выбрать 7.1?
Роман, может напутали с путями, и кстати, проверте от «юзера» кому установили шаблон новой версии PHP, версию php в CLI, скорее всего будет именно дефолтная, так как шаблоны устанавливает только для скриптов а не для CLI. Но некоторые (многие), особенно микрофреймворки используют именно CLI, на ISPmgr это лечится ровно так же как и на vestacp.
Добрый день, помогите плиз , поставил еще на серв 7.0 и 7.2.
создал темплейт под них, не могу понять как исправить строку в
wrapper_script=’#!/usr/bin/php-cgi -cphp5-cgi.ini’
поставил с помощью yum install rh-php70
как правильно прописать wrapper_script?
Вместо /usr/bin/php-cgi должен быть путь к бинарнику php-cgi вашей версии php.
это я понял, а второе -cphp5-cgi.ini что сюда?
Это ini файл откуда настройки php подсасываются. Оставьте как есть.
Никак не получается побороть php.ini настройки для шаблона. Не подгружает файл настроек. Хотя в указанной в phpinfo папке файл php.ini создавал. Как сделать правильно, чтобы подхватывались настройки для шаблона. Может кто-нибудь пошагово расписать у кого получилось побороть это?
Похоже поборол проблему выше) создал файл php.ini в папке /opt/php/php-7.1.33/etc/conf.d и подцепились настройки.
make: *** No targets specified and no makefile found. Stop.
Выбивает, как скомпливеть?
Отсутствует makefile. ./configure ошибкой завершился.
В данной теме устанавливают 6 версий php
[удалено]
Все версии устанавливаются аналогично. Нет смысла повторяться. Ссылки удаляю.
проблема такая, установил пхп несколько версий, всё отлично работает, НО .... в версии пхп по умолчанию есть файл php.ini, а в установленных нету. ДЫК) как настраивать тот же мемори лимит?