Добавление дополнительной версии PHP в веб-сервер Apache на CentOS 7


Тематические термины: PHP, Apache, CentOS, веб-сервер.
В большинстве случаев, для индивидуального использования веб-сервера, достаточно одной версии PHP. Но на хостингах или при ведении нескольких проектов, написанных на разных версиях PHP, необходимо, чтобы виртуальные домены сервера могли поддерживать разные версии интерпретатора.
В данной инструкции рассмотрена настройка на примере веб-сервера Apache, работающего на операционной системе Linux CentOS 7. Подразумевается, что сам веб сервер настроен, например, по статье Как настроить полноценный веб-сервер на CentOS. После конфигурирования у нас будет две версии php на одном сервере Apache.
Добавление новой версии PHP
Настройка веб-сервера
Подключение php
Настройка виртуальных доменов
Тестирование
php_value в .htaccess
Установка еще одной версии PHP
Предположим, на нашем сервере уже установлен PHP версии 5.4.16. Добавим PHP 5.2.17 (также протестировано с версией 7.4.30).
Устанавливаем пакеты, которые нам понадобятся для сборки интерпретатора:
yum install epel-release
yum install wget libxml2-devel openssl-devel libcurl-devel libjpeg-devel libpng-devel bzip2-devel freetype-devel aspell-devel uw-imap-devel libmcrypt-devel libmhash-devel mysql-devel postgresql-devel gcc
* данный набор пакетов не является полным. Например, для PHP версии 7 или для установки дополнительных модулей могут потребоваться другие пакеты. Тут уже нужно ориентироваться по ситуации — получив ошибку при конфигурировании, найти описании проблемы и выполнить соответствующую установку.
Создаем каталог для исходников:
mkdir /usr/local/src/php
... и перейдем в него:
cd /usr/local/src/php
Заходим на страницу загрузки PHP. В зависимости от версии, это будут разные ссылки. Для устаревших версий:
- PHP 5 — museum.php.net/php5.
- PHP 7 — museum.php.net/php7.
- PHP 8 — museum.php.net/php8.
Для актуальных версий — php.net/downloads.
Так как в нашем примере мы устанавливаем PHP 5, переходим по соответствующей ссылке и копируем путь для загрузки исходника:
... используя ссылку, скачиваем исходник на сервер:
wget https://museum.php.net/php5/php-5.2.17.tar.gz
* если CentOS вернет ошибку, необходимо установить wget командой yum install wget.
Для удобства, сохраняем устанавливаемую версию PHP в переменную:
PHP_VER='5.2.17'
Создаем каталог для установки PHP:
mkdir /opt/php-$PHP_VER
Распаковываем скачанный исходник:
tar zxvf php-*.tar.gz
После переходим в каталог с распакованными файлами:
cd php-*/
Сконфигурируем исходники:
./configure --prefix=/opt/php-$PHP_VER --with-config-file-path=/opt/php-$PHP_VER --with-pdo-pgsql --with-zlib-dir --with-freetype-dir --enable-mbstring --with-libxml-dir=/usr --enable-soap --enable-calendar --with-curl=/usr/bin --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 --with-mhash --enable-zip --with-pcre-regex --with-mysql --with-pdo-mysql --with-mysqli --with-jpeg-dir=/usr/lib64 --with-libdir=lib64 --with-png-dir=/usr --enable-gd-native-ttf --with-openssl --enable-ftp --with-imap --with-imap-ssl --with-kerberos --with-gettext --enable-cli --enable-fastcgi --enable-discard-path --enable-force-cgi-redirect --enable-cgi --enable-bcmath
* при конфигурировании, мы можем получить различные ошибки, связанные с нехваткой компонентов. Для решения данного типа проблем, необходима установка дополнительных пакетов. Что это за пакеты — необходимо разобраться самостоятельно.
Также мы, скорее всего, столкнемся с предупреждением configure: WARNING: unrecognized options. Это значит, что некоторые опции не отработали. Такое случается, так как от версии к версии некоторые из них больше не работают или имеют немного другое написание, например не --with-gd, а --enable-gd. Изучите предупреждение и исправьте недочеты.
Собираем пакет и устанавливаем его:
make
make install
Готово. Проверяем:
/opt/php-$PHP_VER/bin/php -v
... получим, примерно, такой ответ:
PHP 5.2.17 (cli) (built: Jul 2 2019 13:37:49)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies
Ошибки установки и их устранение
Во время ручной сборки и установки пакетов, как правило, возникают проблемы. Попробуем описать алгоритм их диагностики и решения.
Ошибки зависимостей
Проще всего решить те, которые связаны с зависимостями — для этого нужно просто установить недостающий компонент. Такие проблемы возникают на стадии конфигурирования (./configure). Например, для PHP версии 7 в нашем примере может появиться ошибка:
No package 'oniguruma' found
Она говорит о том, что для сборки в системе нет dev-пакета с библиотеками регулярных выражений Oniguruma. Для решения ставим пакет:
yum install oniguruma-devel
Индивидуальные ошибки
Также проблемы могут возникнуть во время сборки исходника, например, при установке php 5.2.17 в моем случае появилась ошибка «доступ по указателю на неполный тип ret = buf->buffer->use;». Для решения проблемы необходимо было установить утилиту patch:
yum install patch
Скачать патч для php нужной версии:
wget https://www.dmosk.ru/files/php-5.2.17.patch
... и применить его:
patch -p0 < php-5.2.17.patch
После команда make отработала.
Таким образом, обработка ошибок носит индивидуальный характер. Как правило искать решение необходимо в Интернете.
Настройка apache
Для настройки веб-сервера необходимо подключить к нему нашу новую версию php и настроить виртуальные домены. В нашем примере мы настроим один виртуальный домен для php 5.4.16, второй — 5.2.17.
Подключение новой версии PHP к httpd
Устанавливаем mod_fcgid для httpd:
yum install mod_fcgid
Создаем каталог /usr/lib/cgi-bin:
mkdir /usr/lib/cgi-bin
... в него поместим скрипт, который будет запускаться при обработке php-скриптов:
vi /usr/lib/cgi-bin/php$PHP_VER-cgi
#!/bin/sh
PHPRC="/opt/php-5.2.17/"
export PHPRC
PHP_FCGI_CHILDREN=4
export PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_MAX_REQUESTS
exec /opt/php-5.2.17/bin/php-cgi
* где /opt/php-5.2.17 — путь, по которому была установлена дополнительная версия PHP. Он будет зависеть от версии программного продукта.
Разрешаем запуск его на исполнение:
chmod +x /usr/lib/cgi-bin/php$PHP_VER-cgi
Создаем конфигурационный файл для httpd:
vi /etc/httpd/php$PHP_VER.conf
<Directory /usr/lib/cgi-bin/>
LogLevel warn
Options -Indexes +FollowSymLinks +ExecCGI
Require all granted
</Directory>
<FilesMatch "\.php">
SetHandler application/x-httpd-php5.2.17
</FilesMatch>
ScriptAlias /php5.2.17-cgi /usr/lib/cgi-bin/php5.2.17-cgi
Action application/x-httpd-php5.2.17 /php5.2.17-cgi
AddHandler application/x-httpd-php5.2.17 .php
Настройка виртуальных доменов
Создаем первый виртуальный домен:
vi /etc/httpd/conf.d/test-php5-4-16.conf
<VirtualHost *:80>
ServerName test-php5-4-16.local
DocumentRoot /var/www/test-php
<Directory /var/www/test-php>
Options Indexes FollowSymLinks
AllowOverride all
Require all granted
</Directory>
</VirtualHost>
Создаем второй виртуальный домен:
vi /etc/httpd/conf.d/test-php5-2-17.conf
<VirtualHost *:80>
Include php5.2.17.conf
ServerName test-php5-2-17.local
DocumentRoot /var/www/test-php
<Directory /var/www/test-php>
Options Indexes FollowSymLinks
AllowOverride all
Require all granted
</Directory>
</VirtualHost>
* обратите внимание, что для первого хоста мы используем php, который используется в нашей системе по умолчанию. Для второго домена мы подключаем конфигурационный файл php5-2-17.conf. Также мы будем использовать одну и туже директорию для DocumentRoot — для тестовых задач этого достаточно.
Проверяем конфигурацию Apache:
apachectl configtest
... если видим:
Syntax OK
Перезапускаем сервис:
systemctl restart httpd
Создание тестового сайта и проверка настроек
Создаем каталог для нашего тестового сайта:
mkdir /var/www/php-test
Создаем сайт, содержимое которого — один единственный скрипт:
vi /var/www/php-test/index.php
<?php
phpinfo();
?>
На рабочем компьютере открываем файл hosts:
- Для Linux: /etc/hosts
- Для Windows: \Windows\System32\drivers\etc\hosts
Укажем, что тестовые домены — это наш веб-сервер:
192.168.0.15 test-php5-4-16.local
192.168.0.15 test-php5-2-17.local
* где 192.168.0.15 — IP-адрес моего сервера; test-php5-4-16.local — домен для проверки версии php 5.4.16; test-php5-2-17.local — домен для проверки версии php 5.2.17.
Открываем браузер и заходим на два наших домена:
- http://test-php5-4-16.local/
- http://test-php5-2-17.local/
Мы должны увидеть сводку php с разными версиями:
Обработка php_value в .htaccess
После запуска двух версий php, мы вскоре можем заметить, что вторая (та, что не по умолчанию) не воспринимает настройки php_value из файла .htaccess. Эта проблема связана с тем, что вторичные php мы запустили через php-cgi. Для того, чтобы нужные параметры могли задаваться с помощью htaccess, необходимо установить расширение htscanner.
Установим пакет, необходимый для компиляции расширений php:
yum install autoconf
Заходим на страницу проекта и копируем ссылку на последнюю стабильную версию:
С помощью ссылки загружаем на сервер исходник:
wget https://pecl.php.net/get/htscanner-1.0.1.tgz
... и распаковываем его:
tar -xvzf htscanner-*.tgz
... и после переходим в распакованную папку:
cd htscanner-*
Компилируем расширение:
/opt/php-5.2.17/bin/phpize
* обратите внимание, что мы запускаем phpize из каталога той версии php, которую ставили дополнительно.
Конфигурируем исходник:
./configure --enable-htscanner --with-php-config=/opt/php-5.2.17/bin/php-config
Собираем его и устанавливаем:
make
make install
Установка должна выполниться быстро, а после мы должны увидеть что-то на подобие:
Installing shared extensions: /opt/php-5.2.17/lib/php/extensions/no-debug-non-zts-20060613/
* в данном примере нужный нам модуль был скопирован в каталог /opt/php-5.2.17/lib/php/extensions/no-debug-non-zts-20060613/
Отредактируем или создадим файл php.ini для новой версии PHP:
vi /opt/php-5.2.17/php.ini
... и добавим:
[htscanner]
extension_dir="/opt/php-5.2.17/lib/php/extensions/no-debug-non-zts-20060613/"
extension="htscanner.so"
config_file=".htaccess"
default_docroot="/"
default_ttl=300
stop_on_error = 0
* где /opt/php-5.2.17/lib/php/extensions/no-debug-non-zts-20060613/ — путь, который мы получили после установки htscanner.
Готово — в phpinfo должен появиться модуль htscanner и php_value с php_flag должны передаваться с помощью htaccess.
Установка расширений PHP
Для нативной версии PHP установка расширений может быть выполнена с помощью пакетного менеджера yum. Но для добавленной версии это не поможет — нам нужно пересобрать интерпретатор с нужными опциями. Это не так сложно. Например, добавим к нашей дополнительной версии PHP расширение iconv.
Еще раз создаем переменную с нужной версией PHP (для удобства дальнейшей работы):
PHP_VER='5.2.17'
* в нашем примере это версия 5.2.17.
Переходим в каталог и исходником. В нашем примере это:
cd /usr/local/src/php/php-${PHP_VER}/
* если исходника нет, просто скачиваем его еще раз, как делали во время установки.
Смотрим, с какими опциями была сконфигурирована наша дополнительная версия PHP:
/opt/php-$PHP_VER/bin/php -i | grep "Configure"
Выполняем конфигурирование с этими же опциями и добавляем расширение:
./configure --prefix=/opt/php-$PHP_VER --with-config-file-path=/opt/php-$PHP_VER --with-pdo-pgsql --with-zlib-dir --with-freetype-dir --enable-mbstring --with-libxml-dir=/usr --enable-soap --enable-calendar --with-curl=/usr/bin --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 --with-mhash --enable-zip --with-pcre-regex --with-mysql --with-pdo-mysql --with-mysqli --with-jpeg-dir=/usr/lib64 --with-libdir=lib64 --with-png-dir=/usr --enable-gd-native-ttf --with-openssl --enable-ftp --with-imap --with-imap-ssl --with-kerberos --with-gettext --enable-cli --enable-fastcgi --enable-discard-path --enable-force-cgi-redirect --enable-cgi --enable-bcmath --with-iconv
* напомним, что от версии к версии PHP набор опций и способ включения расширения могут отличаться. Внимательно смотрим статус конфигурирования по его окончании.
Выполняем сборку и устанавливаем наш интерпретатор:
make
make install
Проверяем, что наше расширение подключено. Это можно сделать с помощью вывода phpinfo из командной строки:
/opt/php-$PHP_VER/bin/php -i | grep -i "iconv"
Мы должны увидеть что-то на подобие:
iconv
iconv support => enabled