Настройка Apache2 для нескольких версий PHP

Можно ли создать сайты работающие на разных версиях PHP на одном Apache? Как заставить их работать одновременно, чтобы была возможность открыть в браузере в соседних вкладках?

Да. Профессиональные разработчики используют Docker для разворачивания среды разработки с нужными контейнерами, в том числе и PHP.

Но иногда Docker использовать не хочется. Иногда удобнее, особенно если разработка ведется в linux-средах, иметь рабочий web-сервер, MySQl и др. прямо на локальной машине без контейнеризации. Например в случае разработки нескольких сайтов для размещения в дальнейшем на виртуальном хостинге, использующих одинаковую среду.

Если все фреймворки работают на PHP 8, например, то нет никаких проблем. Устанавливаем Apache2, устанавливаем PHP8.
Но если некоторые из ваших фреймворков работают на PHP7, то вам придется установить PHP7 и переключать версии PHP для работы с каждым сайтом в отдельность. Мне это совсем не нравится.

Nginx и Apache дают возможность настроить виртуальный хост для работы под разными версиями PHP.

На локальной машине я работаю всегда на Apache2. Для него я и опишу настройку.
(Для Open Server под Windows этот способ не подойдет).

Веб-сервер Apache использует виртуальные хосты для управления несколькими доменами в одной системе. PHP-FPM использует демона для управления несколькими версиями PHP в одной системе. Вы можете использовать Apache и PHP-FPM для одновременного хостинга на одном сервере нескольких веб-приложений PHP на основе разных версий PHP. Эта возможность полезна, поскольку разным приложениям могут требоваться разные версии PHP, но некоторые серверные комплексы, в том числе стек LAMP в стандартной конфигурации, могут работать только с одной версией.

Сочетание Apache с PHP-FPM более экономично по сравнению с хостингом каждого приложения на отдельном экземпляре сервера. Для настройки приложений можно использовать конфигурацию виртуального хостинга или использовать файл .htaccess.
PHP-FPM также предлагает разные варианты конфигурации для регистрации данных stderr и stdout, аварийной перезагрузки и адаптивного создания процессов, что полезно для сайтов с высокой нагрузкой.

Пошаговое описание настройки конфигурации сайтов с разными версиями PHP на одном сервере:
Ubuntu 20

1. Установка Apache2:

Сначала обновим систему:   sudo apt update
Установим Apache2: sudo apt install apache2 -y
Проверим статус Apache: sudo systemctl status apache2
Если сервер не работает, запустим его: sudo systemctl start apache2.
Проверим работу web-сервера в браузере: http://localhost - мы увидим стандартную страницу Apache

2. Установка PHP 8.x, PHP 7.x

Подключим репозиторий, который даст нам возможность скачать и установить версии php.
Выполните следующие команды:
sudo apt install software-properties-common -y
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update -y
sudo apt install libapache2-mod-fcgid

Установим PHP7.4: 
sudo apt install php7.4 php7.4-fpm php7.4-mysql libapache2-mod-php7.4 -y
Установим PHP8.1: 
sudo apt install php8.1 php8.1-fpm php8.1-mysql libapache2-mod-php8.1 -y

Проверим какие версии PHP установлены в системе:
ls -la /var/run/php/

3. Запуск PHP-FPM Services
Запустите службу PHP-FPM и убедитесь что она работает для всех нужных вам версий PHP
sudo systemctl start php8.1-fpm
sudo systemctl status php8.1-fpm
sudo systemctl start php7.4-fpm
sudo systemctl status php7.4-fpm

4. Конфигурация Apache2

Для начала необходимо активировать несколько модулей, чтобы служба Apache2 могла работать с несколькими версиями PHP: sudo a2enmod actions fcgid alias proxy_fcgi

  • actions используется для выполнения скриптов CGI на основе типа носителя или метода запроса.
  • fcgid — это высокопроизводительная альтернатива mod_cgi, запускающая достаточное количество экземпляров программы CGI для одновременной обработки запросов.
  • alias позволяет создавать схемы разных деталей файловой системы хоста в дереве документов и для целей переадресации URL.
  • proxy_fcgi позволяет Apache перенаправлять запросы PHP-FPM.

Для того чтобы изменения вступили в силу, выполним перезапуск Apache: sudo systemctl restart apache2

Теперь создадим директории для размещения сайтов.
sudo mkdir /var/www/site1.your_domain
sudo mkdir /var/www/site2.your_domain

По умолчанию веб-сервер Apache работает как пользователь www-data и группа www-data. Для установки необходимых прав выполните следующие команды:
sudo chown -R www-data:www-data /var/www/site1.your_domain
sudo chown -R www-data:www-data /var/www/site2.your_domain
sudo chmod -R 755 /var/www/site1.your_domain
sudo chmod -R 755 /var/www/site2.your_domain

Для проверки разместите в корневых директориях каждого сайта файл info.php
<?php phpinfo(); ?>

Переходим к конфигурации сервера.
Конфигурация возможна двумя способами:

1) Virtual Hosts Method

Создадим файл конфигурации виртуального хостинга для первого сайта.
Выполните команду - sudo nano /etc/apache2/sites-available/site1.your_domain.conf
У вас откроется окно редактора. Добавьте в файл следующее:

<VirtualHost *:80>
ServerAdmin Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript._domain
ServerName site1.your_domain
DocumentRoot /var/www/site1.your_domain
DirectoryIndex info.php
<Directory /var/www/site1.your_domain>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
<FilesMatch \.php$>
# For Apache version 2.4.10 and above, use SetHandler to run PHP as a fastCGI process server
SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/site1.your_domain_error.log
CustomLog ${APACHE_LOG_DIR}/site1.your_domain_access.log combined
</VirtualHost>

Убедитесь, что путь к директории сайта, имя сервера и версия PHP соответствуют вашей системе.
Сохраните и закройте файл. (Для редактора nano - нажмите ctrl+x и отвечайте yes на задаваемые вопросы)

Создайте файл конфигурации для второго сайта:
sudo nano /etc/apache2/sites-available/site2.your_domain.conf

Добавьте в файл следующее:

<VirtualHost *:80>
ServerAdmin Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript._domain
ServerName site2.your_domain
DocumentRoot /var/www/site2.your_domain
DirectoryIndex info.php
<Directory /var/www/site2.your_domain>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
<FilesMatch \.php$>
# For Apache version 2.4.10 and above, use SetHandler to run PHP as a fastCGI process server
SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost"
</FilesMatch>
ErrorLog ${APACHE_LOG_DIR}/site2.your_domain_error.log
CustomLog ${APACHE_LOG_DIR}/site2.your_domain_access.log combined
</VirtualHost>

Сохраните и закройте файл.

Проверьте файл конфигурации Apache на наличие синтаксических ошибок: sudo apachectl configtest
Внимание! Обязательно активируйте оба файла конфигурации виртуального хоста:
sudo a2ensite site1.your_domain
sudo a2ensite site2.your_domain
Отключите сайт по умолчанию: sudo a2dissite 000-default.conf

Перезапустите службу Apache, чтобы применить изменения: sudo systemctl restart apache2

Теперь можно проверить работоспособность сайтов и убедится, что на них работают правильные версии PHP.
Откройте в браузере сайты http://site1.your_domain и http://site2.your_domain. Вы увидите информацию о версии и конфигурации PHP. Обратите внимание на версии PHP, указанные в заголовках страниц.

После тестирования файлы info.php необходимо удалить.
sudo rm -rf /var/www/site1.your_domain/info.php
sudo rm -rf /var/www/site2.your_domain/info.php

Теперь вы может копировать в созданные директории реальные сайты и настраивать индексные страницы, так, как вам необходимо.

(Обратите внимание, при таком способе конфигурации нет необходимости указывать различные порты для разных сайтов. Как видите оба сайта работают на 80 порту)

2) Вместно изменений файлов конфигурации виртуальных хостов, вы можете попробовать использовать файл .htaccess в корневом директории вашего сайта.
Добавьте в ваш .htaccess файл следующий код:

<FilesMatch \.php>
SetHandler "proxy:unix:/var/run/php/php8.1-fpm.sock|fcgi://localhost/"
</FilesMatch>

В том случае, вы должны быть уверены, что в файле конфигурации виртуального хостинга для вашего сайта установлено AllowOverride All.

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

Related Articles