Для управления множеством доменов в одном экземпляре веб-сервер 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/

http://web2.yourdomain.com/

Удалите файлы 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.