*Автор выбрал COVID-19 Relief Fund для получения пожертвования в рамках программы Write for DOnations.*

Введение

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

Также PHP-FPM предлагает разные варианты конфигурации для регистрации данных stderr и stdout, аварийной перезагрузки и адаптивного создания процессов, что полезно для сайтов с высокой нагрузкой. Использование Apache с PHP-FPM — один из лучших вариантов хостинга приложений PHP, особенно с точки зрения производительности.

В этом обучающем руководстве мы настроим два сайта PHP для работы на одном экземпляре сервера. Каждый сайт будет использовать собственный домен, и на каждом домене будет использоваться собственная версия PHP. Первый сайт <^>site1.your_domain<^> развернет PHP 7.0. Второй сайт <^>site2.your_domain<^> развернет PHP 7.2.

Предварительные требования

php illustration for: Предварительные требования
  • Один сервер Debian 10 с не менее чем 1 ГБ оперативной памяти, настроенный согласно руководству Начальная настройка сервера Debian 10, с пользователем non-root user с привилегиями sudo и брандмауэром.
  • Доменное имя, настроенное так, чтобы указывать на ваш сервер Debian 10. Информацию о том, как сделать так, чтобы домены указывали на дроплеты the cloud provider, можно найти в руководстве Создание указаний на серверы имен the cloud provider из общих реестров доменов. Для целей настоящего обучающего руководства мы используем два субдомена, каждый из которых указан с записью A в наших настройках DNS: <^>site1.your_domain<^> и <^>site2.your_domain<^>.

Шаг 1 — Установка PHP версий 7.0 и 7.2 с помощью PHP-FPM

Выполнив предварительные требования, вы можете установить PHP версий 7.0 и 7.2, а также PHP-FPM и некоторые дополнительные расширения. Для этого предварительно необходимо добавить в систему репозиторий sury php.

Вначале установите требуемые пакеты, в том числе curl, wget и gnupg2:

				
					
sudo apt-get install curl wget gnupg2 ca-certificates lsb-release apt-transport-https -y

				
			

Вышеуказанные пакеты позволяют получить безопасный доступ к репозиторию sury php. sury php — это сторонний репозиторий или PPA (архив персональных пакетов). Он предоставляет PHP 7.4, 7.3, 7.2, 7.1 и 7.0 для операционной системы Debian. Также он включает более актуальные версии PHP, чем содержащиеся в официальных репозиториях Debian 10, и позволяет устанавливать несколько версий PHP в одной системе.

Затем импортируйте ключ пакета:

				
					
wget https://packages.sury.org/php/apt.gpg

sudo apt-key add apt.gpg

				
			

Теперь добавьте в систему репозиторий sury php:

				
					
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php7.list

				
			

Обновите репозиторий:

				
					
sudo apt-get update -y

				
			

Установите php7.0, php7.0-fpm, php7.0-mysql, libapache2-mod-php7.0 и libapache2-mod-fcgid с помощью следующих команд:

				
					
sudo apt-get install php7.0 php7.0-fpm php7.0-mysql libapache2-mod-php7.0 libapache2-mod-fcgid -y

				
			
  • php7.0 — это метапакет, который можно использовать для запуска приложений PHP.
  • php7.0-fpm предоставляет интерпретатор Fast Process Manager, который работает как демон и принимает запросы Fast/CGI.
  • php7.0-mysql связывает PHP с базой данных MySQL.
  • libapahce2-mod-php7.0 предоставляет модуль PHP для веб-сервера Apache.
  • libapache2-mod-fcgid содержит mod_fcgid, запускающий несколько экземпляров программы CGI для обработки одновременных запросов.

Повторите процедуру для PHP версии 7.2. Установите php7.2, php7.2-fpm, php7.2-mysql и libapache2-mod-php7.2.

				
					
sudo apt-get install php7.2 php7.2-fpm php7.2-mysql libapache2-mod-php7.2 -y

				
			

После установки обеих версий PHP запустите службу php7.0-fpm:

				
					
sudo systemctl start php7.0-fpm

				
			

Затем проверьте статус службы php7.0-fpm:

				
					
sudo systemctl status php7.0-fpm

				
			

Вывод должен выглядеть так:

				
					
[secondary_label Output]

● php7.0-fpm.service - The PHP 7.0 FastCGI Process Manager

   Loaded: loaded (/lib/systemd/system/php7.0-fpm.service; enabled; vendor preset: enabled)

   Active: &lt;^&gt;active&lt;^&gt; (running) since Sat 2020-04-04 08:51:47 UTC; 1min 17s ago

     Docs: man:php-fpm7.0(8)

 Main PID: 13016 (php-fpm7.0)

   Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"

    Tasks: 3 (limit: 1149)

   Memory: 19.1M

   CGroup: /system.slice/php7.0-fpm.service

           ├─13016 php-fpm: master process (/etc/php/7.0/fpm/php-fpm.conf)

           ├─13017 php-fpm: pool www

           └─13018 php-fpm: pool www



Apr 04 08:51:47 debian10 systemd[1]: Starting The PHP 7.0 FastCGI Process Manager...

Apr 04 08:51:47 debian10 systemd[1]: Started The PHP 7.0 FastCGI Process Manager.



				
			

Повторите процедуру и запустите службу php7.2-fpm:

				
					
sudo systemctl start php7.2-fpm

				
			

Затем проверьте статус службы php7.2-fpm:

				
					
sudo systemctl status php7.2-fpm

				
			

Вывод должен выглядеть так:

				
					
[secondary_label Output]

● php7.2-fpm.service - The PHP 7.2 FastCGI Process Manager

   Loaded: loaded (/lib/systemd/system/php7.2-fpm.service; enabled; vendor preset: enabled)

   Active: &lt;^&gt;active&lt;^&gt; (running) since Sat 2020-04-04 08:52:52 UTC; 1min 32s ago

     Docs: man:php-fpm7.2(8)

  Process: 22207 ExecStartPost=/usr/lib/php/php-fpm-socket-helper install /run/php/php-fpm.sock /etc/php/7.2/fpm/pool.d/www.conf 72 (code=exite

 Main PID: 22204 (php-fpm7.2)

   Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"

    Tasks: 3 (limit: 1149)

   Memory: 12.0M

   CGroup: /system.slice/php7.2-fpm.service

           ├─22204 php-fpm: master process (/etc/php/7.2/fpm/php-fpm.conf)

           ├─22205 php-fpm: pool www

           └─22206 php-fpm: pool www



Apr 04 08:52:52 debian10 systemd[1]: Starting The PHP 7.2 FastCGI Process Manager...

Apr 04 08:52:52 debian10 systemd[1]: Started The PHP 7.2 FastCGI Process Manager.



				
			

В заключение необходимо активировать несколько модулей, чтобы служба 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

				
			

Мы установили на сервере две версии PHP. Теперь создадим структуру директорий для каждого сайта, который будем развертывать.

Шаг 2 — Создание структур директорий для обоих сайтов

В этом разделе мы создадим корневую директорию документов и страницу индекса для каждого из двух сайтов.

Вначале создайте корневые директории документов для <^>site1.your_domain<^> и <^>site2.your_domain<^>:

				
					
sudo mkdir /var/www/&lt;^&gt;site1.your_domain&lt;^&gt;

sudo mkdir /var/www/&lt;^&gt;site2.your_domain&lt;^&gt;

				
			

По умолчанию веб-сервер Apache работает как пользователь www-data и группа www-data. Чтобы убедиться в правильности структуры владения и разрешений для корневых директорий вашего сайта, используйте следующие команды:

				
					
sudo chown -R www-data:www-data /var/www/&lt;^&gt;site1.your_domain&lt;^&gt;

sudo chown -R www-data:www-data /var/www/&lt;^&gt;site2.your_domain&lt;^&gt;

sudo chmod -R 755 /var/www/&lt;^&gt;site1.your_domain&lt;^&gt;

sudo chmod -R 755 /var/www/&lt;^&gt;site2.your_domain&lt;^&gt;

				
			

Далее вы создадите файл info.php в корневой директории каждого сайта. В нем будет отображаться информация о версии PHP для каждого сайта. Начнем с <^>site1<^>:

				
					
sudo nano /var/www/&lt;^&gt;site1.your_domain&lt;^&gt;/info.php

				
			

Добавьте следующую строку:

				
					
[label /var/www/site1.your_domain/info.php]

&lt;?php phpinfo(); ?&gt;

				
			

Сохраните и закройте файл. Скопируйте созданный файл info.php в <^>site2<^>:

				
					
sudo cp /var/www/&lt;^&gt;site1.your_domain&lt;^&gt;/info.php /var/www/&lt;^&gt;site2.your_domain&lt;^&gt;/info.php

				
			

Теперь на вашем веб-сервере должны иметься корневые директории документов, которые требуются каждому сайту для предоставления данных посетителям. Далее мы настроим веб-сервер Apache для работы с двумя разными версиями PHP.

Шаг 3 — Настройка Apache для обоих сайтов

В этом разделе мы создадим два файла конфигурации виртуального хоста. Это позволит двум нашим сайтам одновременно работать с двумя разными версиями PHP.

Для обслуживания этого контента Apache необходимо создать файл виртуального хоста с правильными директивами. Вместо изменения файла конфигурации по умолчанию /etc/apache2/sites-available/000-default.conf мы создадим два новых файла в директории /etc/apache2/sites-available/.

Вначале создайте новый файл конфигурации виртуального хоста для сайта <^>site1.your_domain<^>. Здесь вы предписываете Apache использовать для рендеринга содержимого php7.0:

				
					
sudo nano /etc/apache2/sites-available/&lt;^&gt;site1.your_domain&lt;^&gt;.conf

				
			

Добавьте в файл следующее. Убедитесь, что путь к директории сайта, имя сервера и версия PHP соответствуют вашей системе:

				
					
[label /etc/apache2/sites-available/site1.your_domain.conf]



&lt;VirtualHost *:80&gt;

     ServerAdmin admin@&lt;^&gt;site1.your_domain&lt;^&gt;

     ServerName &lt;^&gt;site1.your_domain&lt;^&gt;

     DocumentRoot /var/www/&lt;^&gt;site1.your_domain&lt;^&gt;

     DirectoryIndex info.php



     &lt;Directory /var/www/&lt;^&gt;site1.your_domain&lt;^&gt;&gt;

        Options Indexes FollowSymLinks MultiViews

        AllowOverride All

        Order allow,deny

        allow from all

     &lt;/Directory&gt;



    &lt;FilesMatch \.php$&gt;

      # For Apache version 2.4.10 and above, use SetHandler to run PHP as a fastCGI process server

      SetHandler "proxy:unix:/run/php/&lt;^&gt;php7.0&lt;^&gt;-fpm.sock|fcgi://localhost"

    &lt;/FilesMatch&gt;



     ErrorLog ${APACHE_LOG_DIR}/&lt;^&gt;site1.your_domain&lt;^&gt;_error.log

     CustomLog ${APACHE_LOG_DIR}/&lt;^&gt;site1.your_domain&lt;^&gt;_access.log combined

&lt;/VirtualHost&gt;

				
			

В этом файле вы изменили директорию на DocumentRoot, а ServerAdmin на адрес электронной почты, доступный администратору сайта your_domain. Также вы изменили параметр ServerName, устанавливающий базовый домен для этой конфигурации виртуального хоста, и добавили директиву SetHandler для запуска PHP как сервера процессов fastCGI.

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

Теперь создайте новый файл конфигурации виртуального хоста для сайта <^>site2.your_domain<^>. Для этого субдомена мы будем развертывать php7.2:

				
					
sudo nano /etc/apache2/sites-available/&lt;^&gt;site2.your_domain&lt;^&gt;.conf

				
			

Добавьте в файл следующее. Убедитесь, что путь к директории сайта, имя сервера и версия PHP соответствуют уникальным параметрам вашей системы:

				
					
[label /etc/apache2/sites-available/site2.your_domain.conf]

&lt;VirtualHost *:80&gt;

     ServerAdmin admin@&lt;^&gt;site2.your_domain&lt;^&gt;

     ServerName &lt;^&gt;site2.your_domain&lt;^&gt;

     DocumentRoot /var/www/&lt;^&gt;site2.your_domain&lt;^&gt;

     DirectoryIndex info.php  



     &lt;Directory /var/www/&lt;^&gt;site2.your_domain&lt;^&gt;&gt;

        Options Indexes FollowSymLinks MultiViews

        AllowOverride All

        Order allow,deny

        allow from all

     &lt;/Directory&gt;



    &lt;FilesMatch \.php$&gt;

      # For Apache version 2.4.10 and above, use SetHandler to run PHP as a fastCGI process server

      SetHandler "proxy:unix:/run/php/&lt;^&gt;php7.2&lt;^&gt;-fpm.sock|fcgi://localhost"

    &lt;/FilesMatch&gt;



     ErrorLog ${APACHE_LOG_DIR}/&lt;^&gt;site2.your_domain&lt;^&gt;_error.log

     CustomLog ${APACHE_LOG_DIR}/&lt;^&gt;site2.your_domain&lt;^&gt;_access.log combined

&lt;/VirtualHost&gt;

				
			

Сохраните файл и закройте его после завершения. Проверьте файл конфигурации Apache на наличие синтаксических ошибок:

				
					
sudo apachectl configtest

				
			

Вывод должен выглядеть так:

				
					
[secondary_label Output]

Syntax OK

				
			

Активируйте оба файла конфигурации виртуального хоста:

				
					
sudo a2ensite &lt;^&gt;site1.your_domain&lt;^&gt;

sudo a2ensite &lt;^&gt;site2.your_domain&lt;^&gt;

				
			

Отключите сайт по умолчанию, поскольку он не потребуется:

				
					
sudo a2dissite 000-default.conf

				
			

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

				
					
sudo systemctl restart apache2

				
			

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

Шаг 4 — Тестирование сайтов

Мы настроили два сайта для работы с двумя разными версиями PHP. Теперь проверим результаты.

Откройте в браузере сайты http://<^>site1.your_domain<^> и http://<^>site2.your_domain<^>. Вы увидите две страницы, выглядящие следующим образом:

Обратите внимание на заголовки. На первой странице указано, что на сайте <^>site1.your_domain<^> развернута версия PHP 7.0. На второй странице указано, что на сайте <^>site2.your_domain<^> развернута версия PHP 7.2.

Мы протестировали сайты и теперь можем удалить файлы info.php. Эти файлы представляют собой угрозу безопасности, поскольку они содержат важную информацию о вашем сервере и при этом доступны неуполномоченным пользователям. Чтобы удалить оба файла, запустите следующие команды:

				
					
sudo rm -rf /var/www/&lt;^&gt;site1.your_domain&lt;^&gt;/info.php

sudo rm -rf /var/www/&lt;^&gt;site2.your_domain&lt;^&gt;/info.php

				
			

Теперь у вас имеется один сервер Debian 10, обслуживающий два сайта с разными версиями PHP. Однако PHP-FPM можно применять и для других целей.

Заключение

Мы объединили виртуальные хосты и PHP-FPM для обслуживания нескольких сайтов и нескольких версий PHP на одном сервере. Количество сайтов PHP и версий PHP, которые может обслуживать ваш сервер Apache, зависит исключительно от вычислительной мощности вашего экземпляра.

Теперь вы можете начать изучение более сложных функций PHP-FPM, таких как процесс адаптивного создания или функции регистрации sdtout и stderr. Также вы можете заняться защитой своих сайтов. Для этого используйте наш обучающий модуль по защите сайтов с помощью бесплатных сертификатов TLS/SSL от Let's Encrypt.