Tutorial

Запуск нескольких версий PHP на одном сервере с использованием Apache и PHP-FPM в Ubuntu 18.04

ApachePHPLAMP StackOpen SourceUbuntu 18.04

Автор выбрал 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.

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

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

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

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: active (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

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

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: active (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/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 для каждого сайта. Начнем с site1:

  • sudo nano /var/www/site1.your_domain/info.php

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

/var/www/site1.your_domain/info.php
<?php phpinfo(); ?>

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

  • sudo cp /var/www/site1.your_domain/info.php /var/www/site2.your_domain/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/site1.your_domain.conf

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

/etc/apache2/sites-available/site1.your_domain.conf

<VirtualHost *:80>
     ServerAdmin admin@site1.your_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.0-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>

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

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

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

  • sudo nano /etc/apache2/sites-available/site2.your_domain.conf

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

/etc/apache2/sites-available/site2.your_domain.conf
<VirtualHost *:80>
     ServerAdmin admin@site2.your_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/php7.2-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

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

Output
Syntax OK

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

  • sudo a2ensite site1.your_domain
  • sudo a2ensite site2.your_domain

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

  • sudo a2dissite 000-default.conf

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

  • sudo systemctl restart apache2

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

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

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

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

Информационная страница PHP 7.0 Информационная страница PHP 7.2

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

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

  • sudo rm -rf /var/www/site1.your_domain/info.php
  • sudo rm -rf /var/www/site2.your_domain/info.php

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

Заключение

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

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

Creative Commons License