Автор выбрал 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
Обновите репозиторий:
Установите 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
. Вы увидите две страницы, выглядящие следующим образом:
Обратите внимание на заголовки. На первой странице указано, что на сайте 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.