*Автор выбрал 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: Предварительные требования
  • Один сервер Ubuntu 18.04 с не менее чем 1 ГБ оперативной памяти, настроенный согласно руководству Начальная настройка сервера Ubuntu 18.04, с пользователем non-root user с привилегиями sudo и брандмауэром.
  • Доменное имя, настроенное так, чтобы указывать на ваш сервер Ubuntu 18.04. Информацию о том, как сделать так, чтобы домены указывали на дроплеты 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 и некоторые дополнительные расширения. Для этого предварительно необходимо добавить в систему репозиторий Ondrej PHP.

Запустите команду apt-get для установки software-properties-common:

				
					
sudo apt-get install software-properties-common -y

				
			

Пакет software-properties-common предоставляет утилиту командной строки apt-add-repository, которую мы используем для добавления репозитория ondrej/php PPA (архив персональных пакетов).

Добавьте в систему репозиторий ondrej/php. Репозиторий ondrej/php PPA содержит более актуальные версии PHP, чем официальные репозитории Ubuntu, а также позволяет устанавливать несколько версий PHP в одной системе:

				
					
sudo add-apt-repository ppa:ondrej/php

				
			

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

				
					
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 Sun 2020-03-29 12:53:23 UTC; 15s ago

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

  Process: 20961 ExecStopPost=/usr/lib/php/php-fpm-socket-helper remove /run/php/php-fpm.sock /etc/php/7.0/fpm/pool.d/www.conf 70 (code=exited,

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

 Main PID: 20963 (php-fpm7.0)

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

    Tasks: 3 (limit: 1150)

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

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

           ├─20977 php-fpm: pool www

           └─20978 php-fpm: pool www

				
			

Повторите процедуру и запустите службу 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 Sun 2020-03-29 12:53:22 UTC; 45s ago

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

 Main PID: 20897 (php-fpm7.2)

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

    Tasks: 3 (limit: 1150)

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

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

           ├─20909 php-fpm: pool www

           └─20910 php-fpm: pool www

				
			

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

				
			

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

Заключение

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

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