Сервер: Как обновить PHP до 8.2, 8.3 или 8.4 на AlmaLinux 8/9

Инструкция помогает безопасно переключить системную версию 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, протестировать приложения и переключить трафик после проверки.

Официальная документация

up: Просмотров: 1.9k
Материал помог? Оценка помогает находить устаревшие и спорные решения.

Комментарии

0

Нашли ошибку или хотите дополнить материал?

Комментариев пока нет.Можно первым дополнить материал или сообщить об ошибке.
Telegram