Запуск нескольких версий PHP на одном сервере с помощью Apache и PHP-FPM в CentOS 7

Веб-сервер Apache использует виртуальные хосты для управления несколькими доменами в рамках одного сервера. Точно так же для управления несколькими версиями PHP в рамках одного сервера PHP-FPM использует специальный демон. Объединив эти возможности Apache и PHP-FPM, вы можете одновременно разместить на одном сервере несколько веб-приложений PHP, каждое из которых будет использовать индивидуальную версию PHP. Это удобно, потому что для разных приложений могут потребоваться разные версии PHP, но часто серверные стеки (например, стандартный LAMP) могут управлять только одной версией. Сочетание Apache с PHP-FPM – экономное решение, ведь вам не придется размещать каждое приложение на отдельном сервере.

Читайте также: Установка стека LAMP в CentOS 7

PHP-FPM также предлагает параметры для логирования stderr и stdout, аварийных перезапусков и адаптивного запуска процессов, что полезно для сайтов с высоким трафиком. Фактически связка Apache+PHP-FPM – один из лучших стеков для размещения приложений PHP, особенно когда дело касается производительности.

В этом мануале мы покажем, как запустить два сайта PHP на одном сервере. Каждый сайт будет использовать свой собственный домен, каждый домен будет развертывать свою собственную версию PHP. Первый, site1.your_domain, использует PHP 7.0; второй, site2.your_domain, использует PHP 7.2.

Требования

  • Сервер CentOS 7 (1GB RAM минимум), настроенный по этому мануалу, включая пользователя с привилегиями sudo и включенный брандмауэр.
  • Веб-сервер Apache, установить который вам поможет этот мануал.
  • Доменные имена, направленные на ваш сервер. В данном мануале мы используем два условных домена: site1.your_domain и site2.your_domain. Для каждого домена нужно создать DNS-запись А.

1: Установка PHP 7.0 и PHP 7.2

Выполнив предварительные требования к мануалу, мы можем установить PHP версий 7.0 и 7.2, а также PHP-FPM и несколько дополнительных расширений. Чтобы установить несколько версий PHP на один сервер, необходимо установить и включить репозиторий SCL (Software Collections). Он обеспечивает поддержку многих версий PHP для системы CentOS 7. Если вам нужна новая версия PHP, которой нет в SCL, обратитесь к PPA репозиторию remi.

Вы можете добавить репозиторий SCL в свою систему, используя следующую команду:

sudo yum install centos-release-scl -y

Сначала давайте узнаем, какие версии PHP 7 доступны в SCL:

sudo yum list rh-php7[0-9].x86_64

Вы увидите примерно такой результат:

Available 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

Давайте сначала установим версию 7.0. Для этого нам нужны пакеты 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 and rh-php72-php-fpm.

sudo yum install rh-php72  rh-php72-php-fpm -y

После установки обеих версий PHP запустите сервисы:

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 в CentOS 7: базовые понятия

Теперь вы можете запустить и включить свои сервисы, давайте начнем с 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

Вы увидите следующий результат:

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.

Повторите этот процесс для версии 7.2; запустите сервис rh-php72-php-fpm и добавьте его в автозагрузку с помощью следующих команд:

sudo systemctl start rh-php72-php-fpm
sudo systemctl enable rh-php72-php-fpm

А затем проверьте состояние сервиса h-php72-php-fpm с помощью следующей команды:

sudo systemctl status rh-php72-php-fpm

Вы увидите следующий результат:

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. После этого мы можем создать структуру каталогов для каждого сайта, который должен обслуживаться этим сервером.

2: Создание структуры каталогов для сайтов

Теперь мы создадим корневые каталоги для каждого сайта, который будет развернут на этом сервере. В нашем мануале мы развернем 2 сайта: site1.your_domain и site2.your_domain. Создавая каталоги, укажите домены ваших сайтов.

sudo mkdir /var/www/site1.your_domain
sudo mkdir /var/www/site2.your_domain

По умолчанию веб-сервер Apache запускается как пользователь и группа apache. Чтобы убедиться, что права собственности и доступа на корневые каталоги сайтов установлены верно, выполните следующие команды:

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. Команда 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.

3: Настройка Apache для поддержки двух сайтов

В этом разделе вы создадите два конфигурационных файла для виртуального хоста. Это позволит двум вашим веб-сайтам одновременно работать в рамках одного сервера с двумя разными версиями PHP.

Чтобы Apache обслуживал этот контент, необходимо создать виртуальный хост с правильными директивами. Создайте два новых файла конфигурации виртуального хоста в каталоге /etc/httpd/conf.d/.

Сначала создайте новый конфигурационный файл хоста для сайта site1.your_domain. Здесь мы настроим Apache для обработки контента с помощью php7.0.

sudo vi /etc/httpd/conf.d/site1.your_domain.conf

Вставьте в файл следующие строки. Убедитесь, что вы указали правильный путь к корневому каталогу, ServerName и версию 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. Этот поддомен будет обслуживаться версией php7.2.

sudo vi /etc/httpd/conf.d/site2.your_domain.conf

Добавьте следующий код в файл. Убедитесь, что путь к корневому каталогу, ServerName и версия 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

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

sudo systemctl restart httpd

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

4: Тестирование настройки

Итак, мы уже настроили два веб-сайта, которые работают на двух разных версиях PHP. Давайте проверим результаты.

Откройте браузер и посетите оба сайта.

http://site1.your_domain
http://site2.your_domain

Вы увидите две страницы с информацией о PHP. Обратите внимание на заголовки этих страниц. На первой странице указано, что 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 на одном сервере. Единственное практическое ограничение на количество сайтов PHP и версий PHP, которые может обрабатывать Apache, — это вычислительная мощность вашего экземпляра.

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

Читайте также: Создание сертификата Let’s Encrypt для Apache в CentOS 7

Tags: , , , ,

Добавить комментарий