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

Обновлено Обновлено: Опубликовано Опубликовано:

Тематические термины: PHP, Apache, CentOS, веб-сервер.

В большинстве случаев, для индивидуального использования веб-сервера, достаточно одной версии PHP. Но на хостингах или при ведении нескольких проектов, написанных на разных версиях PHP, необходимо, чтобы виртуальные домены сервера могли поддерживать разные версии интерпретатора.

В данной инструкции рассмотрена настройка на примере веб-сервера Apache, работающего на операционной системе Linux CentOS 7. Подразумевается, что сам веб сервер настроен, например, по статье Как настроить полноценный веб-сервер на CentOS. После конфигурирования у нас будет две версии php на одном сервере Apache.

Установка еще одной версии 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.net/downloads.

Так как в нашем примере мы устанавливаем PHP 5, переходим по соответствующей ссылке и копируем путь для загрузки исходника:

Копируем ссылку на PHP 5.2.17

... используя ссылку, скачиваем исходник на сервер:

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.

Открываем браузер и заходим на два наших домена:

  1. http://test-php5-4-16.local/
  2. http://test-php5-2-17.local/

Мы должны увидеть сводку php с разными версиями:

phpinfo для 5.4.16

phpinfo для 5.2.17

Обработка php_value в .htaccess

После запуска двух версий php, мы вскоре можем заметить, что вторая (та, что не по умолчанию) не воспринимает настройки php_value из файла .htaccess. Эта проблема связана с тем, что вторичные php мы запустили через php-cgi. Для того, чтобы нужные параметры могли задаваться с помощью htaccess, необходимо установить расширение htscanner.

Установим пакет, необходимый для компиляции расширений php:

yum install autoconf

Заходим на страницу проекта и копируем ссылку на последнюю стабильную версию:

Ссылка на загрузку htscanner

С помощью ссылки загружаем на сервер исходник:

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 

# CentOS # Серверы
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет