Стало интересно проверить свои знания и навыки и я откликнулся на вакансию Ведущий системный администратор. Мне сообщили, что скоро будет выслано тестовое задание, которое нужно выполнить в течение часа. Ну а спустя некоторое время пришло вот такое вот задание:
Добрый день!
В продолжении разговора направляем Вам тестовое задание.
Поставьте и настройте 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 и добавляем правила для файрвола.
1 2 3 | dnf -y install httpd firewall-cmd --add-service=http firewall-cmd --runtime-to-permanent |
Делаем небольшие правки в файле /etc/httpd/conf/httpd.conf
1 2 3 4 5 6 7 8 | # 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 |
Этого хватит, рестартуем апач и проверяем его состояние.
1 2 | systemctl restart httpd systemctl status httpd |
С апачем пока все, ставим две версии php — 7.4 и 8.4
Для начала добавим репозиторий remi и проверим какие версии и модули php нам доступны
1 2 | 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
1 2 3 | sudo dnf module reset php sudo dnf module enable php:remi-7.4 sudo dnf install php74 php74-php-fpm -y |
И теперь тоже самое для версии 8.4
1 2 3 | sudo dnf module reset php sudo dnf module enable php:remi-8.4 sudo dnf install php84 php84-php-fpm -y |
Стартуем обе версии и проверяем их статус
1 2 3 4 | 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 и проверим что получилось.
1 | nano /var/www/html/7.php |
1 2 3 4 | <?php echo "7"; phpinfo(); ?> |
1 | nano /var/www/html/8.php |
1 2 3 4 | <?php echo "8"; phpinfo(); ?> |
А теперь создадим файл .htaccess с таким вот содержимым:
1 2 3 4 5 6 7 8 | <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 без проблем настроил.