Table of Contents
*Автор выбрал 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.
Предварительные требования
- Один сервер Debian 10 с не менее чем 1 ГБ оперативной памяти, настроенный согласно руководству Начальная настройка сервера Debian 10, с пользователем non-root user с привилегиями sudo и брандмауэром.
- Веб-сервер Apache, установленный и настроенный в соответствии с указаниями руководства Установка веб-сервера Apache в Debian 10.
- Доменное имя, настроенное так, чтобы указывать на ваш сервер 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: <^>active<^> (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: <^>active<^> (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/<^>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
Добавьте следующую строку:
[label /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 соответствуют вашей системе:
[label /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 соответствуют уникальным параметрам вашей системы:
[label /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
Вывод должен выглядеть так:
[secondary_label 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<^>. Вы увидите две страницы, выглядящие следующим образом:
Обратите внимание на заголовки. На первой странице указано, что на сайте <^>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
Теперь у вас имеется один сервер Debian 10, обслуживающий два сайта с разными версиями PHP. Однако PHP-FPM можно применять и для других целей.
Заключение
Мы объединили виртуальные хосты и PHP-FPM для обслуживания нескольких сайтов и нескольких версий PHP на одном сервере. Количество сайтов PHP и версий PHP, которые может обслуживать ваш сервер Apache, зависит исключительно от вычислительной мощности вашего экземпляра.
Теперь вы можете начать изучение более сложных функций PHP-FPM, таких как процесс адаптивного создания или функции регистрации sdtout и stderr. Также вы можете заняться защитой своих сайтов. Для этого используйте наш обучающий модуль по защите сайтов с помощью бесплатных сертификатов TLS/SSL от Let's Encrypt.