Домены
Интересные статьи
Домены

Как установить свою версию PHP в Webmin/Usermin/Virtualmin

В начале декабря ко мне обратился мой знакомый с довольно нетривиальной задачей: у него имелся сервер на Ubuntu 16.04, с установленной на него панелью Webmin и модулем для нее Usermin, на данный сервер нужно было поставить PHP 7.4 и PHP 8.0. Вроде бы простая задача, подключай PPA ondrej/php и поставь нужные пакеты, но все оказалось сложнее.

Ни ondrej, ни sury, ни даже dotdeb уже не поддерживали 16.04, а сервер нельзя было тушить и обновлять, поэтому было принято решение собрать нужные версии PHP из исходников и подсунуть панельке. Заранее скажу, что идея сработала и без каких-либо нареканий прошла все тесты. Сборка PHP 7.4 практически ничем не отличается (кроме префикса и самой цифры в путях), поэтому опишу только сборку 7.4, а сборка 8.0 делается по аналогии, с небольшой оговоркой, о которой в конце

Исходные данные

  • Сервер c Ubuntu 16.04
  • Панель Webmin 1.932 c модулем Usermin 1.780
  • На сервере стоит уже какая-либо версия PHP (у знакомого стояла 7.2)
  • Root или sudo доступ к серверу (в моем случае sudo)

Установка необходимых компонентов для сборки

Сначала установим все необходимые компоненты для сборки, т.к. на сервере знакомого используется MySQL, то со стороны PHP будем ставить пакеты только под нее.

Обновим список пакетов

apt update
Обновление списка пакетов

Установка инструментов для сборки

Помимо инструментов для сборки установим также зависимости для сборки PHP

apt install git build-essential autoconf re2c bison libxml2-dev libssl-dev pkg-config zlib1g-dev libsodium-dev libcurl4-openssl-dev libjpeg-turbo8-dev libbz2-dev libpng++-dev libfreetype6-dev libzip-dev libkrb5-dev libsqlite3-dev libwebp-dev libxpm-dev libc-client2007e-dev libonig-dev libreadline-dev libxslt-dev -y

Сборка и установка PHP 7.4.27

Загрузка исходных кодов PHP

Командами ниже, мы скачаем архив в /usr/src с исходными кодами с официального сайта, распакуем его и перейдем в распакованную директорию

wget https://www.php.net/distributions/php-7.4.27.tar.gz -O /usr/src/php-7.4.27.tar.gz
cd /usr/src
tar xfvz php-7.4.27.tar.gz
cd php-7.4.27

Конфигурация PHP

Мы будем собирать и устанавливать PHP в директорию /usr/local/php7, этот путь указывается в префиксе и еще нескольких директивах. Будьте внимательны, если меняете директорию. В Webmin установленный MySQL имеет сокет в /var/run/mysqld/mysqld.sock, поэтому его же укажем и для своей версии.

./configure \
	--prefix=/usr/local/php7 \
	--with-config-file-path=/usr/local/php7/etc \
	--with-config-file-scan-dir=/usr/local/php7/etc/conf.d \
	--enable-bcmath \
	--enable-calendar \
	--with-bz2 \
	--with-curl \
	--enable-filter \
	--enable-exif \
	--enable-fpm \
	--enable-ftp \
	--enable-gd \
	--with-webp \
	--with-jpeg \
	--with-xpm \
	--with-freetype \
	--with-gettext \
	--with-kerberos \
	--with-imap-ssl \
	--enable-pcntl \
	--with-imap \
	--enable-intl \
	--enable-mbstring \
	--enable-mysqlnd \
	--with-mysql-sock=/var/run/mysqld/mysqld.sock \
	--with-mysqli=mysqlnd \
	--with-pdo-mysql=mysqlnd \
	--with-pdo-sqlite \
	--with-readline \
	--enable-shmop \
	--with-sodium \
	--enable-sysvmsg \
	--enable-sysvsem \
	--enable-sysvshm \
	--enable-soap \
	--enable-sockets \
	--disable-phpdbg \
	--disable-phpdbg-webhelper \
	--enable-opcache \
	--with-openssl \
	--enable-simplexml \
	--with-sqlite3 \
	--enable-xmlreader \
	--enable-xmlwriter \
	--with-xmlrpc \
	--with-xsl \
	--with-zlib \
	--with-fpm-user=www-data \
	--with-fpm-group=www-data
Окончание конфигурации PHP

После этапа конфигурации нам нужно собственно собрать сам PHP и установить его:

Сборка и установка PHP

Запустим сборку PHP с помощью команды make, я запускаю в 4 потока, замените это число на количество ядер вашего процессора. Больше потоков — быстрее сборка.

make -j 4

Сборка может занимать продолжительное время. В конце сборки вы увидите приблизительно такой вывод:

Сборка PHP успешно завершена

Теперь установим PHP, это можно сделать следующей командой:

make install

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

PHP успешно установлен в /usr/local/php7

На этом сам процесс сборки и установки PHP завершен. Теперь нужно «подсунуть» эту версию Webmin/Usermin, чтобы они ее увидели и смогли работать.

Подготовка PHP для работы с Webmin/Usermin

Размещение файлов конфигурации и симлинков

Первое, что нам нужно сделать после установки нашей версии PHP — разместить нужные файлы конфигурации и симлинки так, чтобы это выглядело, будто он установлен из репозиториев. Дело в том, что Webmin/Usermin ищут их по определенным путям и нам нужно соответствовать им.

Сначала разместим service файл PHP-FPM для systemd. С помощью любого удобного вам редактора создайте файл /lib/systemd/system/php7.4-fpm.service . Я буду использовать для этого nano

nano /lib/systemd/system/php7.4-fpm.service

После чего, вставьте в него следующее содержимое:

[Unit]
Description=The PHP 7.4 FastCGI Process Manager
Documentation=man:php-fpm7.4(8)
After=network.target

[Service]
Type=simple
PIDFile=/run/php-fpm/php7.4-fpm.pid
ExecStart=/usr/sbin/php-fpm7.4 --nodaemonize --fpm-config /etc/php/7.4/fpm/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target

Сохраните файл и закройте редактор. Далее займемся симлинками и файлами конфигурации.

Скопируем директорию с конфигурацией PHP 7.2 для нашей версии PHP 7.4. Это сделано для того, чтобы не заниматься правками нового php.ini, а подключить уже имеющийся с минимальными затратами. При этом из скопированной директории удаляем вложенную директорию conf.d и заменим ее на симлинки

cp -R /etc/php/7.2/ /etc/php/7.4
rm -rf /etc/php/7.4/{cli,cgi,fpm}/conf.d
mkdir /usr/local/php7/etc/conf.d
ln -s /usr/local/php7/etc/conf.d /etc/php/7.4/cgi/conf.d
ln -s /usr/local/php7/etc/conf.d /etc/php/7.4/cli/conf.d
ln -s /usr/local/php7/etc/conf.d /etc/php/7.4/fpm/conf.d

Теперь, подготовим сами файлы конфигурации. Нам не интересна стандартная конфигурация, поэтому мы удалим ее и заменим копией из скопированной ранее директории 7.2

rm -rf /usr/local/php7/etc/php-fpm.conf.default /usr/local/php7/etc/php-fpm.d/www.conf.default
ln -s /etc/php/7.4/fpm/php.ini /usr/local/php7/etc/php.ini
ln -s /etc/php/7.4/fpm/php-fpm.conf /usr/local/php7/etc/php-fpm.conf

Также поступим и с пулами FPM по умолчанию:

rm -rf /etc/php/7.4/fpm/pool.d/*
cp /etc/php/7.2/fpm/pool.d/ /etc/php/7.4/fpm/pool.d/

Т.к. пулы и конфигурацию PHP-FPM мы скопировали с версии 7.2, внутри файлов конфигурации остались пути, ведущие на 7.2, заменим их на соответствующие:

sed -i 's/7.2/7.4/g' /etc/php/7.4/fpm/pool.d/www.conf
sed -i 's/7.2/7.4/g' /etc/php/7.4/fpm/php-fpm.conf

Теперь очередь за симлинками на бинарные файлы PHP, чтобы их увидели Webmin/Usermin:

ln -s /usr/local/php7/sbin/php-fpm /usr/sbin/php-fpm7.4
ln -s /usr/local/php7/bin/php /usr/bin/php7.4
ln -s /usr/local/php7/bin/php-cgi /usr/bin/php-cgi7.4
ln -s /usr/local/php7/bin/php-config /usr/bin/php-config7.4
ln -s /usr/local/php7/bin/phpize /usr/bin/phpize7.4
ln -s /usr/local/php7/bin/phar.phar /usr/bin/phar.phar7.4
ln -s /usr/local/php7/bin/phar.phar /usr/bin/phar7.4

Проверим, что PHP 7.4 работает, для этого запросим показ версии:

php7.4 -v
Версия PHP 7.4

Подключение к Webmin/Usermin

Теперь осталось проверить, а видит ли Webmin/Usermin нашу установленную версию PHP. Это можно сделать командой

virtualmin check-config

Если вам повезло и вы увидели в строках со скриншота вашу версию PHP, то считайте вам повезло. Но скорее всего вам не повезет также, как и мне, я не увидел свою версию ни в строке с CGI, ни в строке с FPM.

Доступные версии PHP для режимов CGI/FPM

Этот факт меня немного расстроил, но я решил понять «а собственно почему так?». В итоге выяснил. Т.к. была установлена довольно старая версия Webmin, то доступных (и возможных) версий PHP там был зашит в коде. Зачем так сделали разработчики — не понятно, но этот список нужно было отредактировать.

Чтобы отредактировать список, нужно открыть любым удобным текстовым редактором файл /usr/share/webmin/virtual-server/virtual-server-lib.pl . Я для этих целей буду использовать nano

nano /usr/share/webmin/virtual-server/virtual-server-lib.pl

Далее, найдите в этом файле строку:

@all_possible_php_versions =

У меня она выглядела так:

@all_possible_php_versions = (5, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9,
                              "7.0", 7.1, 7.2, 7.3);

Как видно, Webmin/Usermin «не знает», что существуют версии PHP выше 7.3, а значит надо об этом ему «сказать». Нужно добавить соответствующие версии через запятую, при условии, что каждый мажорный релиз должен быть в двойных кавычках. Я привел строку к такому виду:

@all_possible_php_versions = (5, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9,
                              "7.0", 7.1, 7.2, 7.3, 7.4, "8.0", 8.1);

После правок я снова запустил virtualmin check-config и чудо свершилось, нужна версия появилась в списке. Но счастье мое было недолгим.. Нужная версия появилась только в режиме CGI, а не в FPM, который по умолчанию использует Usermin. Пришлось ковыряться дальше.

А дальше оказалось довольно неожиданное решение от разработчиков Webmin/Usermin. Вместо того, чтобы проверять конфигурационные файлы и наличие бинарных файлов PHP-FPM, они проверяют наличие установленного в системе пакета с php<тут версия>-fpm в имени. И если его нет — значит и поддержки FPM для этой версии нет, даже не смотря на то, что все бинарные файлы при этом существуют. Ну это не страшно, можно систему немного обмануть.

Создание и сборка пустого .deb пакета с нужным именем

Раз панель ищет именно установленный пакет, но ей все равно на бинарные файлы при этом, значит сделаем пакет-пустышку и установим. Этом можно сделать с помощью пакета equivs. Установим его в систему:

apt install equivs

Далее создадим заготовку под пакет php7.4-fpm:

equivs-control php7.4-fpm

В результате в текущей директории будет создан файл php7.4-fpm со следующим содержимым:

### Commented entries have reasonable defaults.
### Uncomment to edit them.
# Source: <source package name; defaults to package name>
Section: misc
Priority: optional
# Homepage: <enter URL here; no default>
Standards-Version: 3.9.2

Package: <package name; defaults to equivs-dummy>
# Version: <enter version here; defaults to 1.0>
# Maintainer: Your Name <yourname@example.com>
# Pre-Depends: <comma-separated list of packages>
# Depends: <comma-separated list of packages>
# Recommends: <comma-separated list of packages>
# Suggests: <comma-separated list of packages>
# Provides: <comma-separated list of packages>
# Replaces: <comma-separated list of packages>
# Architecture: all
# Multi-Arch: <one of: foreign|same|allowed>
# Copyright: <copyright file; defaults to GPL2>
# Changelog: <changelog file; defaults to a generic changelog>
# Readme: <README.Debian file; defaults to a generic one>
# Extra-Files: <comma-separated list of additional files for the doc directory>
# Files: <pair of space-separated paths; First is file to include, second is destination>
#  <more pairs, if there's more than one file to include. Notice the starting space>
Description: <short description; defaults to some wise words>.
 long description and info
 .
 second paragraph

Приведем его к минимальному виду, указав версию PHP, для которой собрали и файл, который доставляется этим пакетом.

Section: misc
Priority: optional
Standards-Version: 3.9.2

Package: php7.4-fpm
Version: 7.4.27+cyber01+virtual.package
Maintainer: cyber01 <help@cyber01.ru>
Architecture: all
Files: test_php7.4-fpm.conf /etc/php7.4-fpm_virtual
Description: Virtual package for webmin in ubuntu 16.04

Т.е. в файле выше мы указали, что:

  • Имя нашего пакета: php7.4-fpm
  • Версия пакета: 7.4.27+cyber01+virtual.package
  • Сопровождает пакет: cyber01 help@cyber01.ru т.е. я
  • Пакет доступен для всех архитектур
  • Пакет предоставляет файл test_php7.4-fpm.conf, который будет будет помещен в директорию /etc/php7.4-fpm_virtual
  • Ну и описание пакета

Также, нужно собственно создать файл test_php7.4-fpm.conf рядом с нашим php7.4-fpm. Содержимое файла не имеет значения.

Теперь, когда все подготовительные этапы готовы, можем собрать пакет и позже — установить его.

Сборка пакета довольно простая и выполняется командой:

equivs-build php7.4-fpm

В результате, в текущей директории будет создан .deb файл с именем: php7.4-fpm_7.4.27+cyber01+virtual.package_all.deb. Т.е. фактически: «имя пакета + версия + список архитектур».deb.

Теперь осталось дело за малым — установить его:

dpkg -i php7.4-fpm_7.4.27+cyber01+virtual.package_all.deb

Всё, теперь пакет установлен и virtualmin check-config должен увидеть FPM конфигурацию. Теперь можно запустить наш FPM сервис и добавить его в автозагрузку:

systemctl enable php7.4-fpm --now

А дальше уже продолжить использовать новую версию дальше, но я все же рекомендую обновиться до актуальных версий ОС т.к. использование неподдерживаемых версий небезопасно.

Также, если получилось так, что проверка конфигурации видит нужные версии PHP, а при этом сама панель нет — попробуйте сам webmin перезапустить. Это можно сделать как из консоли, так и из самой панели, пройдя по пути: Webmin — Webmin Configuration и внизу нажать кнопку Restart Webmin.

На этом всё, надеюсь кому-либо будет полезно.

Обо мне cyber01

Прочитайте также

Как сделать дамп только нужных записей из базы данных

Бывало такое, что из всей таблицы нужно сделать дамп только определенных строк? Например, результата какого-либо …

Как добавить поддержку ГОСТ 34.10 2012 в CentOS 7/Redhat 7

Именно с такой задачей я столкнулся несколько дней назад на работе. Требовалось организовать поддержку ГОСТовых …

Как исправить «/usr/bin/dirmngr: No such file or directory»

Такая ошибка можем периодически появляться при импорте GnuPG ключей в Debian системах. А связано это …

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

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