Использование нескольких версий PHP с Apache на CentOS / RHEL

Для управления множеством доменов в одном экземпляре веб-сервер Apache использует виртуальные хосты. Аналогично этому PHP-FPM управляет многими версиями PHP на одном экземпляре с помощью демона. С помощью Apache и PHP-FPM на одном сервере можно одновременно размещать несколько веб-приложений PHP, работающих с различными версиями PHP. Это полезно, поскольку некоторые серверные стеки, например обычный LAMP-стек, могут управлять только одной версией PHP, хотя различным приложениям может понадобиться несколько версий. Хостинг каждой программы на отдельном экземпляре обходится дороже; сочетание Apache с PHP-FPM дешевле.

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

В этом уроке вы создадите два PHP-сайта на одном экземпляре. Каждый сайт будет иметь свой собственный домен и использовать разные версии PHP. Первый сайт будет запускать PHP 8.0 на web1.yourdomain.com. На втором будет развернут PHP 7.4 на web2.yourdomain.com.

Требования

  • CentOS 7 или Redhat Server.
  • Установлен и настроен веб-сервер Apache.
  • Доменное имя настроено так, чтобы указывать на наш сервер.

Шаг 1: Установка версий PHP и Apache

Сначала мы установим epel repo, а затем установим Apache с помощью следующих команд.

$ sudo yum install epel-release -y
$ sudo yum install httpd

После настройки Apache мы установим репозиторий Remi, а затем версии PHP 80 и 7.4.

$ sudo yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
$ sudo yum install yum-utils 
$ sudo yum install php80 php74
$ sudo yum install php80-php-fpm php74-php-fpm

Обе версии PHP по умолчанию прослушивают порт 9000. Однако в этом учебнике мы хотим запустить две версии одновременно. Следовательно, давайте назначим два новых порта:

Вы можете сделать это, открыв выбранный вами текстовый редактор, перейдя по адресу /etc/opt/remi/php80/php-fpm.d/www.conf, и измените каждый экземпляр 9000 на 9080. Повторите то же самое для /etc/opt/remi/php74/php-fpm.d/www.conf, заменяя 9000 с 9074 на этот раз, затем сохраните и закройте файл. В качестве альтернативы вы можете создать замены с помощью этих двух команд sed:

$ sudo sed -i 's/:9000/:9080/' /etc/opt/remi/php80/php-fpm.d/www.conf
$ sudo sed -i 's/:9000/:9074/' /etc/opt/remi/php74/php-fpm.d/www.conf

Теперь у каждого из ваших PHP-сервисов есть уникальный порт, который был выделен для них. Однако, чтобы эти изменения заработали, необходимо добавить порты в настройки SELinux.

Security Enhanced Linux, или сокращенно SELinux, по умолчанию включен в CentOS 7. Ваши новые порты 9080 и 9074 должны быть добавлены в базу данных SELinux и назначены службам httpd, чтобы ваши приложения могли работать. Примените semanage команду к следующему действию:

$ sudo semanage port -a -t http_port_t -p tcp 9080
$ sudo semanage port -a -t http_port_t -p tcp 9074

Теперь службы php-fpm могут быть запущены на разных портах.

Теперь вы готовы к запуску и включению служб PHP. Начните с php80-php-fpm службу и включите ее запуск при загрузке:

$ sudo systemctl start php80-php-fpm
$ sudo systemctl enable php80-php-fpm

Далее проверьте состояние службы php80-php-fpm:

$ sudo systemctl status php80-php-fpm
[root@centos7 ~]# sudo systemctl status php80-php-fpm
● php80-php-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/php80-php-fpm.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2022-08-12 07:16:12 EDT; 14min ago
 Main PID: 65544 (php-fpm)
   Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"
   CGroup: /system.slice/php80-php-fpm.service
           ├─65544 php-fpm: master process (/etc/opt/remi/php80/php-fpm.conf)
           ├─65545 php-fpm: pool www
           ├─65546 php-fpm: pool www
           ├─65547 php-fpm: pool www
           ├─65548 php-fpm: pool www
           └─65549 php-fpm: pool www
Aug 12 07:16:12 centos7.linuxvmimages.local systemd[1]: Starting The PHP FastCGI Process Manager...
Aug 12 07:16:12 centos7.linuxvmimages.local systemd[1]: Started The PHP FastCGI Process Manager.

Теперь вы готовы к запуску и включению служб PHP. Начните с вашего php74-php-fpm службу и включите ее запуск при загрузке:

$ sudo systemctl start php74-php-fpm
$ sudo systemctl enable php74-php-fpm

Далее проверьте состояние службы php74-php-fpm:

$ sudo systemctl status php74-php-fpm
[root@centos7 ~]# sudo systemctl status php74-php-fpm
● php74-php-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/php74-php-fpm.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2022-08-12 07:16:20 EDT; 16min ago
 Main PID: 65556 (php-fpm)
   Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"
   CGroup: /system.slice/php74-php-fpm.service
           ├─65556 php-fpm: master process (/etc/opt/remi/php74/php-fpm.conf)
           ├─65557 php-fpm: pool www
           ├─65558 php-fpm: pool www
           ├─65559 php-fpm: pool www
           ├─65560 php-fpm: pool www
           └─65561 php-fpm: pool www
Aug 12 07:16:19 centos7.linuxvmimages.local systemd[1]: Starting The PHP FastCGI Process Manager...
Aug 12 07:16:20 centos7.linuxvmimages.local systemd[1]: Started The PHP FastCGI Process Manager.

Шаг 2: Создание каталогов для обоих сайтов

В этом разделе для каждого из двух сайтов вы создадите индексную страницу и корневой каталог документа.

Сначала мы создадим каталоги для наших сайтов web1.yourdomain.com и web2.yourdomain.com.

$ sudo mkdir /var/www/web1.yourdomain.com
$ sudo mkdir /var/www/web2.yourdomain.com

Пользователь и группа Apache являются стандартными для веб-сервера Apache. Поэтому они также должны принадлежать /var/www/ и все его файлы и подкаталоги. Выполните следующие команды, чтобы убедиться, что корневые папки вашего сайта принадлежат вам и имеют соответствующие разрешения:

$ sudo chown -R apache:apache /var/www/web1.yourdomain.com
$ sudo chown -R apache:apache /var/www/web2.yourdomain.com
$ sudo chmod -R 755 /var/www/web1.yourdomain.com
$ sudo chmod -R 755 /var/www/web2.yourdomain.com

Теперь две папки вашего сайта принадлежат пользователю и группе Apache благодаря команде chown команда. Команда chmod Команда изменяет разрешения этого пользователя и группы, а также других людей.

Следующим шагом будет создание info.php файл в корневом каталоге каждого сайта. В нем будет отображаться информация о версии PHP для каждого сайта. начиная с web1.

$ sudo nano /var/www/web1.yourdomain.com/info.php

Добавьте следующую строку:

<?php phpinfo(); ?>

Сохраните и скопируйте файл на второй сайт:

$ sudo cp /var/www/web1.yourdomain.com/info.php /var/www/web2.yourdomain.com/info.php

Шаг 3: Конфигурация Apache для обоих сайтов

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

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

Сначала создайте новый файл конфигурации виртуального хоста для веб-сайта web1.yourdomain.com. Здесь вы направите Apache на рендеринг содержимого с помощью PHP 8.0:

$ sudo nano /etc/httpd/conf.d/web1.yourdomain.com.conf

Добавьте следующий код

<VirtualHost *:80>
     ServerAdmin [email protected]
     ServerName web1.yourdomain.com
     DocumentRoot /var/www/web1.yourdomain.com
     DirectoryIndex info.php
     SetHandler "proxy:fcgi://127.0.0.1:9080"
     ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
     AddHandler php80-fcgi .php
     Action php80-fcgi /cgi-bin/php80.fcgi
     ErrorLog /var/log/httpd/web1.yourdomain.com_error.log
     CustomLog /var/log/httpd/web1.yourdomain.com_access.log combined
</VirtualHost>

Сделаем то же самое для нашего второго сервера.

$ sudo nano /etc/httpd/conf.d/web2.yourdomain.com.conf
<VirtualHost *:80>
     ServerAdmin [email protected]
     ServerName web2.yourdomain.com
     DocumentRoot /var/www/web2.yourdomain.com
     DirectoryIndex info.php
     SetHandler "proxy:fcgi://127.0.0.1:9074"
     ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
     AddHandler php74-fcgi .php
     Action php74-fcgi /cgi-bin/php74.fcgi
     ErrorLog /var/log/httpd/web2.yourdomain.com_error.log
     CustomLog /var/log/httpd/web2.yourdomain.com_access.log combined
</VirtualHost>

Когда закончите, сохраните и закройте файл. После этого найдите синтаксические ошибки в конфигурационном файле Apache:

$ sudo apachectl configtest
[root@centos7 ~]# sudo apachectl configtest
Syntax OK

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

$ sudo systemctl restart httpd

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

Шаг 4: Тестирование наших сайтов

Откройте веб-браузер и посетите оба сайта http://web1.yourdomain.com и http://web2.yourdomain.com. Вы увидите две страницы, которые выглядят следующим образом:

http://web1.yourdomain.com/

web1.yourdomain.com php_info

http://web2.yourdomain.com/

web2.yourdomain.com php_info redhat

Удалите файлы info.php после тестирования ваших сайтов. Они представляют собой проблему безопасности, поскольку предоставляют неавторизованным пользователям доступ к частной информации о вашем сервере. Избавьтесь от этих файлов:

$ sudo rm -rf /var/www/web1.yourdomain.com/info.php
$ sudo rm -rf /var/www/web2.yourdomain.com/info.php

Теперь на одном сервере CentOS 7 вы работаете с двумя веб-сайтами, использующими две разные версии PHP. Но PHP-FPM предназначен не только для этого одного приложения.

Заключение

Теперь, когда виртуальные хосты и PHP-FPM объединились, один сервер может обслуживать множество сайтов и версий PHP. Вычислительная мощность вашего экземпляра — единственное реальное ограничение на количество PHP-сайтов и версий PHP, которые может поддерживать ваш сервер Apache.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *