Автор выбрал 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.
A
в наших настройках DNS: site1.your_domain
и site2.your_domain
.Выполнив предварительные требования, вы можете установить 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
Вывод должен выглядеть так:
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
Вывод должен выглядеть так:
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. Теперь создадим структуру директорий для каждого сайта, который будем развертывать.
В этом разделе мы создадим корневую директорию документов и страницу индекса для каждого из двух сайтов.
Вначале создайте корневые директории документов для 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
Добавьте следующую строку:
<?php phpinfo(); ?>
Сохраните и закройте файл. Скопируйте созданный файл info.php
в site2
:
- sudo cp /var/www/site1.your_domain/info.php /var/www/site2.your_domain/info.php
Теперь на вашем веб-сервере должны иметься корневые директории документов, которые требуются каждому сайту для предоставления данных посетителям. Далее мы настроим веб-сервер Apache для работы с двумя разными версиями PHP.
В этом разделе мы создадим два файла конфигурации виртуального хоста. Это позволит двум нашим сайтам одновременно работать с двумя разными версиями 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 соответствуют вашей системе:
<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 соответствуют уникальным параметрам вашей системы:
<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
Вывод должен выглядеть так:
OutputSyntax OK
Активируйте оба файла конфигурации виртуального хоста:
- sudo a2ensite site1.your_domain
- sudo a2ensite site2.your_domain
Отключите сайт по умолчанию, поскольку он не потребуется:
- sudo a2dissite 000-default.conf
Перезапустите службу Apache, чтобы применить изменения:
- sudo systemctl restart apache2
Мы настроили Apache для обслуживания каждого из сайтов и теперь протестируем их и убедимся, что на них работают правильные версии PHP.
Мы настроили два сайта для работы с двумя разными версиями 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.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!