Инструкция помогает безопасно переключить системную версию PHP на 8.2, 8.3 или 8.4 в AlmaLinux 8/9 через модульный репозиторий Remi. Подход рассчитан на сервер с одной основной версией PHP и подходит для обновления с PHP 8.0, 8.1, 8.2 или 8.3.
Когда решение не подходит: сервером управляет Plesk, DirectAdmin, CloudLinux или другая панель со своим менеджером PHP; PHP собран из исходников; используются несколько версий PHP одновременно; нет root-доступа. В этих случаях обновление нужно выполнять средствами панели, контейнеров или Remi Software Collections.
Какую версию PHP выбрать
PHP 8.2получает только исправления безопасности до 31 декабря 2026 года. Выбирайте его лишь при ограничениях совместимости.PHP 8.3получает исправления безопасности до 31 декабря 2027 года. Подходит, если приложение или отдельные расширения ещё не готовы к PHP 8.4.PHP 8.4активно поддерживается до 31 декабря 2026 года, а исправления безопасности выходят до 31 декабря 2028 года. Для большинства обновляемых проектов это рекомендуемая цель.
PHP 8.5 уже доступен, но в этой инструкции не рассматривается. Для перехода со старого проекта на PHP 8.0/8.1 версия 8.4 обычно является более консервативной production-целью.
DNF позволяет технически переключиться сразу с PHP 8.0 на 8.4. Код приложения при этом должен быть проверен с учётом изменений всех промежуточных веток: 8.1, 8.2, 8.3 и 8.4.
1. Проверка текущего окружения
Сначала проверьте версию AlmaLinux, текущий PHP, активный поток DNF и загруженные конфигурационные файлы.
cat /etc/redhat-release rpm -E %rhel php -v php --ini dnf module list php --enabled systemctl status php-fpm --no-pager
Перед обновлением AlmaLinux должна быть приведена к актуальному состоянию внутри своей основной ветки 8.x или 9.x. Старые зафиксированные minor-релизы могут не содержать библиотек, необходимых свежим пакетам Remi.
dnf upgrade --refresh
Если обновились ядро, systemd, glibc или другие системные компоненты, перезагрузите сервер до переключения PHP.
2. Проверка приложения до обновления
На production-сервере желательно заранее проверить проект в staging-окружении. Для Composer-проекта можно найти зависимости, блокирующие выбранную версию PHP.
cd /var/www/example.com # Замените 8.4 на выбранную версию composer prohibits php 8.4 composer check-platform-reqs
Не совмещайте без необходимости обновление PHP с массовым обновлением Composer-зависимостей. Так будет проще понять причину ошибки и выполнить откат.
3. Резервная копия конфигурации и списка расширений
Перед изменением потока DNF сделайте снимок VPS или резервную копию сервера. Дополнительно сохраните PHP-конфигурацию, список RPM-пакетов, расширений и активный модульный поток.
BackupDir="/root/php-upgrade-$(date +%F-%H%M%S)"
install -d -m 0700 "$BackupDir"
cp -a /etc/php.ini "$BackupDir/" 2>/dev/null || true
cp -a /etc/php.d "$BackupDir/" 2>/dev/null || true
cp -a /etc/php-fpm.conf "$BackupDir/" 2>/dev/null || true
cp -a /etc/php-fpm.d "$BackupDir/" 2>/dev/null || true
rpm -qa --qf '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' | grep '^php' | sort > "$BackupDir/php-packages-before.txt"
php -m | sort > "$BackupDir/php-modules-before.txt"
dnf module list php --enabled > "$BackupDir/php-module-before.txt"
echo "Резервная копия: $BackupDir"
4. Подключение EPEL, CRB/PowerTools и Remi
Для AlmaLinux 8 используется репозиторий PowerTools, для AlmaLinux 9 — CRB. Номер основной версии системы можно получить автоматически через rpm -E %rhel.
ElMajorVersion="$(rpm -E %rhel)"
dnf install -y dnf-plugins-core epel-release
case "$ElMajorVersion" in
8)
dnf config-manager --set-enabled powertools
;;
9)
dnf config-manager --set-enabled crb
;;
*)
echo "Поддерживаются только AlmaLinux 8 и 9"
exit 1
;;
esac
dnf install -y "https://rpms.remirepo.net/enterprise/remi-release-${ElMajorVersion}.rpm"
dnf makecache
dnf repolist | grep -E 'epel|remi|powertools|crb'
Не используйте --nogpgcheck и случайные сторонние RPM-репозитории. Пакеты PHP и расширения должны поступать из одного совместимого набора репозиториев.
5. Переключение на PHP 8.2, 8.3 или 8.4
Укажите целевую версию. Для нового обновления в большинстве случаев выбирайте 8.4.
TargetPhpVersion="8.4"
dnf module list php
dnf module switch-to "php:remi-${TargetPhpVersion}/common"
dnf update --refresh
Перед подтверждением внимательно прочитайте транзакцию DNF. Если пакетный менеджер предлагает удалить nginx, базу данных, панель управления или большое количество несвязанных пакетов, отмените операцию и найдите конфликт репозиториев.
Если команда module switch-to сообщает, что активного потока PHP нет, используйте сброс и включение нужного потока:
TargetPhpVersion="8.4"
dnf module reset php
dnf module enable "php:remi-${TargetPhpVersion}"
dnf distro-sync
Не удаляйте PHP командой dnf remove 'php*'. Она может удалить PHP-приложения, зависимости и связанные компоненты сервера, а также усложнить восстановление конфигурации.
6. Проверка и установка расширений
При переключении потока совместимые установленные пакеты php-* обычно обновляются автоматически. DNF остановит операцию, если установленное PECL-расширение несовместимо с выбранной версией.
Проверьте установленные пакеты:
dnf list installed 'php*' php -m | sort
Пример набора распространённых расширений для обычного PHP-FPM-сервера:
dnf install php-cli php-fpm php-common php-opcache php-pdo php-mysqlnd php-mbstring php-xml php-gd php-intl php-process php-zip
Устанавливайте только используемые расширения. Отдельный пакет php-json для современных версий PHP обычно не требуется: JSON входит в ядро PHP.
Особенно внимательно проверьте сторонние PECL-модули и закрытые загрузчики: Imagick, Redis, Memcached, Xdebug, ionCube, SourceGuardian и другие расширения должны иметь сборку для выбранной ветки PHP.
7. Проверка PHP-FPM и перезапуск сервисов
Перезапуска PHP-FPM избежать нельзя: простой перезапуск nginx не загрузит новую версию PHP.
php -v php-fpm -v php-fpm -t systemctl restart php-fpm systemctl status php-fpm --no-pager --full nginx -t && systemctl reload nginx
Если используется Apache, проверьте конфигурацию и перезапустите его вместо nginx:
apachectl configtest && systemctl restart httpd
8. Проверка результата
Сравните список расширений до и после обновления. Команда diff вернёт ненулевой код, если найдены различия — это нормально.
php -m | sort > "$BackupDir/php-modules-after.txt" diff -u "$BackupDir/php-modules-before.txt" "$BackupDir/php-modules-after.txt" || true
Проверьте конфигурацию, OPcache, Composer-зависимости, сайт и журнал PHP-FPM:
php --ini
php --ri opcache
cd /var/www/example.com
composer check-platform-reqs
curl -fsS -o /dev/null -w 'HTTP %{http_code}, time %{time_total}s\n' https://example.com/
journalctl -u php-fpm -n 100 --no-pager
CLI и PHP-FPM — разные SAPI. Успешный вывод php -v ещё не доказывает, что сайт обслуживается новой версией. Проверьте реальный HTTP-запрос, health-check приложения или временный закрытый диагностический endpoint. Не оставляйте публичный файл с phpinfo().
Для проекта с тестами дополнительно запустите их штатной командой, например:
vendor/bin/phpunit
Краевые случаи и диагностика
После обновления nginx возвращает 502 Bad Gateway
Проверьте запуск PHP-FPM, его журнал и совпадение сокета в PHP-FPM и nginx.
systemctl status php-fpm --no-pager --full journalctl -u php-fpm -n 100 --no-pager grep -R "^*listen*=" /etc/php-fpm.d/ grep -R "fastcgi_pass" /etc/nginx/
DNF сообщает о конфликте расширения
Не применяйте --allowerasing вслепую. Найдите несовместимый пакет, проверьте наличие сборки для новой версии и только затем временно удалите либо замените конкретное расширение. После успешного обновления установите его совместимую версию.
Настройки PHP изменились после обновления
RPM обычно сохраняет пользовательские конфигурации, но может создать файлы .rpmnew или .rpmsave. Проверьте их и вручную перенесите необходимые параметры.
find /etc -type f \( -name '*.rpmnew' -o -name '*.rpmsave' \) -print
Проект работает на старом фреймворке или CMS
Проверьте официальную матрицу совместимости проекта. Особенно часто проблемы возникают из-за устаревших сигнатур методов, динамических свойств, изменений типов, deprecated-возможностей и старых Composer-зависимостей.
Откат на предыдущую версию
Надёжнее всего восстановить снимок VPS, созданный непосредственно перед обновлением. Если нужно срочно вернуться на предыдущий поток Remi, укажите прежнюю версию и выполните обратное переключение.
PreviousPhpVersion="8.3"
dnf module switch-to "php:remi-${PreviousPhpVersion}/common"
dnf distro-sync
php-fpm -t
systemctl restart php-fpm
nginx -t && systemctl reload nginx
Перед подтверждением проверьте, какие пакеты DNF собирается понизить или удалить. Откат RPM-пакетов не восстанавливает изменённые конфигурации, Composer-зависимости и данные приложения.
Историю пакетных транзакций можно посмотреть отдельно:
dnf history list dnf history info <ID>
Возврат на PHP 8.0 или 8.1 допустим только как кратковременная аварийная мера: эти ветки больше не поддерживаются проектом PHP.
Безопасность
- Обновляйте production только после резервной копии и проверки проекта в staging.
- Не отключайте SELinux и firewalld ради исправления ошибок PHP.
- Не смешивайте пакеты PHP из Remi, неизвестных RPM-репозиториев и ручной сборки.
- Не используйте
--nogpgcheckи не подтверждайте удаление большого количества пакетов без анализа. - Не публикуйте
phpinfo(): вывод раскрывает пути, переменные окружения, модули и конфигурацию сервера. - Проверьте права, владельцев сокета PHP-FPM и доступ nginx после переключения версии.
Производительность
После перезапуска PHP-FPM кеш OPcache пуст, поэтому первые запросы могут выполняться немного медленнее. Проверьте, что расширение php-opcache установлено и включено.
php --ri opcache
Не включайте JIT автоматически ради ускорения обычного сайта: для большинства CMS и CRUD-приложений правильно настроенный OPcache полезнее. После обновления сравните время ответа и расход памяти PHP-FPM, а затем при необходимости скорректируйте pm.max_children, memory_limit и параметры OPcache.
Совместимость
- AlmaLinux 8 и AlmaLinux 9, обновлённые внутри своей основной ветки.
- Одна системная версия PHP из модульного репозитория Remi.
- PHP-FPM с nginx или Apache.
- Архитектуры, для которых Remi публикует соответствующие пакеты.
Для параллельной работы нескольких версий PHP используйте Remi Software Collections с пакетами вида php84-php-*, контейнеры или возможности серверной панели. Команды из этой инструкции переключают основную системную ветку php-*.
Альтернативы
- Remi Software Collections — несколько версий PHP одновременно без замены системного потока.
- Docker или Podman — изоляция версии PHP и расширений для каждого проекта.
- Панель управления сервером — используйте её собственный механизм обновления, если PHP установлен панелью.
- Новый сервер — для критичного production иногда безопаснее подготовить новый VPS, протестировать приложения и переключить трафик после проверки.
Комментарии
0Нашли ошибку или хотите дополнить материал?