Стало интересно проверить свои знания и навыки и я откликнулся на вакансию Ведущий системный администратор. Мне сообщили, что скоро будет выслано тестовое задание, которое нужно выполнить в течение часа. Ну а спустя некоторое время пришло вот такое вот задание:
Добрый день!
В продолжении разговора направляем Вам тестовое задание.
Поставьте и настройте lamp + php 7 + php 8. Предоставьте ссылки по
http с указанными версиями php. Например, http://192.168.1.135/7.php и http://192.168.1.135/8.php
*** SSH ***
username: root
password: *********
Результат отправьте ответным письмом.
Зайдя по ssh я увидел такую вот виртуалку.
Меня это немного смутило — с AlmaLinux я еще не сталкивался. Когда то давно любил очень Федорушку, но потом как то все перетекло в Debian/Ubuntu и все чаще использовался Nginx. Поэтому данная статься может быть не интересна тем, кто постоянно работает с такой системой и апачем. Я же решил поковыряться и заодно описать что и как получилось. Так что не обессудьте...
Скажу сразу — задание за час я не выполнил — апач и обе версии php я установил и запустил, но потом пошел по пути виртуальных хостов (по привычке уже), понял что действую не так. Время рабочее, приходилось отвлекаться. Поэтому по прошествии часа я ответил на письмо, написал что не справился и поблагодарил за интересное задание. А уже вечером скачал свежий дистрибутив Almalinux и запустил на нем виртуалку. Открыл мануалы по апачу и сделал все вот так вот.
Моя виртуалка немного отличалась версией, но не критично.
Ставим Apache и добавляем правила для файрвола.
dnf -y install httpd
firewall-cmd --add-service=http
firewall-cmd --runtime-to-permanentДелаем небольшие правки в файле /etc/httpd/conf/httpd.conf
# line 100 : изменим на свое имя сервера
ServerName www.my.home:80
# line 149 : Меняем строку, нужно убрать Indexes
Options FollowSymLinks
# line 156 : Меняем с none на All
AllowOverride All
# line 169 : добавим индексный файл с расширением php
DirectoryIndex index.html index.phpЭтого хватит, рестартуем апач и проверяем его состояние.
systemctl restart httpd
systemctl status httpdС апачем пока все, ставим две версии php — 7.4 и 8.4
Для начала добавим репозиторий remi и проверим какие версии и модули php нам доступны
sudo dnf install http://rpms.remirepo.net/enterprise/remi-release-9.rpm
sudo dnf module list phpПолучаем что-то вроде этого:
Отлично, идем дальше.
Выключаем модуль php и включаем модуль php:remi-7.4 и после этого ставим дополнительные компоненты php74 и php74-php-fpm
sudo dnf module reset php
sudo dnf module enable php:remi-7.4
sudo dnf install php74 php74-php-fpm -yИ теперь тоже самое для версии 8.4
sudo dnf module reset php
sudo dnf module enable php:remi-8.4
sudo dnf install php84 php84-php-fpm -yСтартуем обе версии и проверяем их статус
sudo systemctl start php74-php-fpm
sudo systemctl start php84-php-fpm
sudo systemctl status php84-php-fpm
sudo systemctl status php74-php-fpmВсе работает. Теперь перезапустим Апач, создадим два файла php и проверим что получилось.
nano /var/www/html/7.php<?php
echo "7";
phpinfo();
?>nano /var/www/html/8.php<?php
echo "8";
phpinfo();
?>А теперь создадим файл .htaccess с таким вот содержимым:
<FilesMatch 7.php$>
SetHandler "proxy:unix:/var/opt/remi/php74/run/php-fpm/www.sock|fcgi://localhost"
</FilesMatch>
<FilesMatch 8.php$>
SetHandler "proxy:unix:/var/opt/remi/php84/run/php-fpm/www.sock|fcgi://localhost"
</FilesMatch>Перезапустим Apache и проверим.
Информация о версии 7
Информация о версии 8.
Все получилось. Реально получилось сделать все это меньше чем за час. Через виртуальные хосты тоже можно сделать, но тогда появится еще один уровень вложенности ну или обращение по разным именам хостов. А тут обращение на один и тот же айпишник (или имя сервера) и только разные файлы, которые обрабатываются разной версией обработчика php
Мне решение понравилось. Но я больше люблю Nginx и следом напишу как это сделать в нем, просто через location.
Всем добра.









Интересное задание. По сути простое, если работаешь с apache. Я бы тоже не догадался, как быстро выдать разные версии php на нём. Просто нет практики. В Nginx бы через location без проблем настроил.