Автор выбрал 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_domai
n развернет PHP 7.0. Второй сайт site2.your_domain
site2.your_domain<^>` развернет PHP 7.2.
A
в наших настройках DNS: site1.your_domain
и site2.your_domain
.После выполнения предварительных требований мы установим версии PHP 7.0 и 7.2. Репозиторий SCL (Software Collections) содержит множество версий стеков PHP для систем CentOS 7. Если вам нужна абсолютно новая версия PHP, которой нет на SCL, проверьте remi
PPA (персональные архивы пакетов).
Начнем с установки репозитория SCL в вашу систему:
- sudo yum install centos-release-scl -y
Сначала узнаем, какие версии PHP 7 доступны в SCL:
- sudo yum list rh-php7[0-9].x86_64
Вывод будет выглядеть следующим образом:
OutputAvailable Packages
rh-php70.x86_64 2.3-1.el7 centos-sclo-rh
rh-php71.x86_64 1-1.el7 centos-sclo-rh
rh-php72.x86_64 1-2.el7 centos-sclo-rh
rh-php73.x86_64 1-1.el7 centos-sclo-rh
Вы заметите, что доступна также новейшая версия, PHP 7.3. Но в наших примерах мы установим версии 7.0 и 7.2.
Начнем с более ранней версии. Установите rh-php70
и rh-php70-php-fpm
:
- sudo yum install rh-php70 rh-php70-php-fpm -y
rh-php70
— это метапакет, который запускает приложения PHP.rh-php70-php-fpm
предоставляет интерпретатор Fast Process Manager, который работает как демон и принимает запросы Fast/CGI.Повторите процедуру для PHP версии 7.2. Установите rh-php72
и rh-php72-php-fpm
.
- sudo yum install rh-php72 rh-php72-php-fpm -y
Далее запустите следующие команды для начала использования обеих коллекций Software Collections:
- sudo scl enable rh-php70 bash
- sudo scl enable rh-php72 bash
По умолчанию обе версии PHP прослушивают порт 9000
. Но в этом обучающем руководстве мы хотим запустить две версии одновременно. Поэтому назначим два новых порта:
Для этого откройте /etc/opt/rh/rh-php70/php-fpm.d/www.conf
в предпочитаемом текстовом редакторе и измените каждое представление 9000
на 9002
. Затем сохраните и закройте файл и повторите процедуру для /etc/opt/rh/rh-php72/php-fpm.d/www.conf
, только сейчас замените 9000
на 9003
. Вы можете использовать эти две команды sed
поочередно, чтобы выполнить замены:
- sudo sed -i 's/:9000/:9002/' /etc/opt/rh/rh-php70/php-fpm.d/www.conf
- sudo sed -i 's/:9000/:9003/' /etc/opt/rh/rh-php72/php-fpm.d/www.conf
Сейчас вы назначили выделенный порт для каждой из ваших служб PHP. Перед выполнением этих изменений необходимо, тем не менее, добавить порты в вашу конфигурацию SELinux.
SELinux — это сокращение от Security Enhanced Linux, которое активируется по умолчанию на CentOS 7. Необходимо добавить новые порты 9002
и 9003
в вашу базу данных SELinux и назначить их для ваших служб httpd, иначе ваши приложения не будут запускаться. Для выполнения этой задачи используйте команду semanage
:
- sudo semanage port -a -t http_port_t -p tcp 9002
- sudo semanage port -a -t http_port_t -p tcp 9003
Флаг -a
указывает на то, что вы добавляете объект в базу данных. Флаг -t
указывает тип объекта, которым в данном случае является http_port_t
. А флаг -p
определяет протокол tcp
. Дополнительную информацию о SELinux и команде semanage
можно найти в этом обучающем руководстве или обратившись к официальной документации SELinux.
Теперь вы готовы запустить и активировать ваши службы PHP. Начнем со службы rh-php70-php-fpm
и активируем ее запуск во время загрузки:
- sudo systemctl start rh-php70-php-fpm
- sudo systemctl enable rh-php70-php-fpm
Затем проверьте статус службы rh-php70-php-fpm
:
- sudo systemctl status rh-php70-php-fpm
Вывод будет выглядеть следующим образом:
Output● rh-php70-php-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/rh-php70-php-fpm.service; enabled; vendor preset: disabled)
Active: active (running) since Sat 2020-04-18 04:49:59 UTC; 1min 6s ago
Main PID: 1852 (php-fpm)
Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"
CGroup: /system.slice/rh-php70-php-fpm.service
├─1852 php-fpm: master process (/etc/opt/rh/rh-php70/php-fpm.conf)
├─1853 php-fpm: pool www
├─1854 php-fpm: pool www
├─1855 php-fpm: pool www
├─1856 php-fpm: pool www
└─1857 php-fpm: pool www
Apr 18 04:49:59 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Starting The PHP FastCGI Process Manager...
Apr 18 04:49:59 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Started The PHP FastCGI Process Manager.
Повторите эту процедуру, запустите службу rh-php72-php-fpm
и активируйте ее запуск во время загрузки:
- sudo systemctl start rh-php72-php-fpm
- sudo systemctl enable rh-php72-php-fpm
Затем проверьте статус службы rh-php72-php-fpm
:
- sudo systemctl status rh-php72-php-fpm
Другой вывод будет выглядеть следующим образом:
Output● rh-php72-php-fpm.service - The PHP FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/rh-php72-php-fpm.service; enabled; vendor preset: disabled)
Active: active (running) since Sat 2020-04-18 04:50:04 UTC; 1min 59s ago
Main PID: 1876 (php-fpm)
Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"
CGroup: /system.slice/rh-php72-php-fpm.service
├─1876 php-fpm: master process (/etc/opt/rh/rh-php72/php-fpm.conf)
├─1877 php-fpm: pool www
├─1878 php-fpm: pool www
├─1879 php-fpm: pool www
├─1880 php-fpm: pool www
└─1881 php-fpm: pool www
Apr 18 04:50:04 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Starting The PHP FastCGI Process Manager...
Apr 18 04:50:04 centos-s-1vcpu-1gb-blr1-01 systemd[1]: Started The PHP FastCGI Process Manager.
Мы установили на сервере две версии PHP. Теперь создадим структуру каталогов для каждого сайта, который будем развертывать.
В этом разделе мы создадим корневой каталог документов и страницу индекса для каждого из двух сайтов.
Вначале создайте корневые каталоги документов для site1.your_domain
и site2.your_domain
:
- sudo mkdir /var/www/site1.your_domain
- sudo mkdir /var/www/site2.your_domain
По умолчанию веб-сервер Apache работает как пользователь apache
и группа apache
. Поэтому /var/www/
и все его файлы и подкаталоги также должны принадлежать им. Запустите следующие команды для проверки правильности владения и разрешений корневых каталогов вашего веб-сайта:
- sudo chown -R apache:apache /var/www/site1.your_domain
- sudo chown -R apache:apache /var/www/site2.your_domain
- sudo chmod -R 755 /var/www/site1.your_domain
- sudo chmod -R 755 /var/www/site2.your_domain
Команда chown
меняет владельца двух каталогов веб-сайта на пользователя apache
и группу apache
. Команда chmod
меняет разрешения, связанные с этим и другими пользователями и группами.
Далее вы создадите файл info.php
в корневом каталоге каждого сайта. В нем будет отображаться информация о версии PHP для каждого сайта. Начнем с site1
:
- sudo vi /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/httpd/conf.d/
.
Вначале создайте новый файл конфигурации виртуального хоста для сайта site1.your_domain
. Здесь вы предписываете Apache использовать для рендеринга содержимого PHP 7.0:
- sudo vi /etc/httpd/conf.d/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
SetHandler "proxy:fcgi://127.0.0.1:9002
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
AddHandler php70-fcgi .php
Action php70-fcgi /cgi-bin/php70.fcgi
ErrorLog /var/log/httpd/site1.your_domain_error.log
CustomLog /var/log/httpd/site1.your_domain_access.log combined
</VirtualHost>
Для DocumentRoot
вы указываете путь корневого каталога вашего веб-сайта. Для ServerAdmin
вы добавляете адрес электронной почты, к которому имеет доступ администратор сайта your_domain
. Для ServerName
вы добавляете url для вашего первого субдомена. Для SetHandler
вы указываете порт 9002
. Остальные директивы также настраивают вашу службу для развертывания PHP 7.0.
Сохраните и закройте файл.
Теперь создайте новый файл конфигурации виртуального хоста для сайта site2.your_domain
. Для этого субдомена мы будем развертывать PHP 7.2:
- sudo vi /etc/httpd/conf.d/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
SetHandler "proxy:fcgi://127.0.0.1:9003
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
AddHandler php72-fcgi .php
Action php72-fcgi /cgi-bin/php72.fcgi
ErrorLog /var/log/httpd/site2.your_domain_error.log
CustomLog /var/log/httpd/site2.your_domain_access.log combined
</VirtualHost>
Сохраните файл и закройте его после завершения. Проверьте файл конфигурации Apache на наличие синтаксических ошибок:
- sudo apachectl configtest
Вы увидите вывод с текстом Syntax OK
:
- OutputSyntax OK
Перезапустите службу Apache, чтобы применить изменения:
- sudo systemctl restart httpd
Мы настроили 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
Теперь у вас имеется один сервер CentOS 7, обслуживающий два сайта с двумя разными версиями 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!