Обновление PHP дает прирост производительности, новые функции и закрывает уязвимости. Правильная стратегия — поставить новую ветку PHP рядом со старой, перенести расширения, переключить веб-сервер на новый FPM и только потом удалить старую ветку.
Наш план:
- Проверить текущую версию и список расширений.
- Установить репозиторий с мульти-PHP пакетами.
- Поставить новую ветку PHP (CLI, FPM, нужные расширения).
- Переключить Nginx или Apache на новый php-fpm.
- Переключить CLI через update-alternatives.
- Протестировать, затем удалить старую ветку.
1) Подготовка: что у вас стоит сейчас
php -v || true
php -m || true
ps aux | grep -i php-fpm | grep -v grep || true
ls /etc/php || true
Сохраните список установленных расширений старой ветки, чтобы затем поставить их аналоги для новой:
# пример: если текущая ветка 8.1 — замените при необходимостиdpkg -l | awk '/^ii\s+php8\.1-/{print $2}' | tee /root/php81-packages.txt
Создайте резервную копию ключевых конфигов:
mkdir -p /root/backup-php
cp -a /etc/php /root/backup-php/php-$(date +%F)
Ubuntu 22.04/24.04: добавляем PPA и ставим новую ветку PHP
sudo apt update
sudo apt install -y software-properties-common ca-certificates lsb-release apt-transport-https
sudo add-apt-repository -y ppa:ondrej/php
sudo apt update
Установите нужную версию. Ниже — пример для 8.3:
sudo apt install -y php8.3 php8.3-fpm php8.3-cli php8.3-common php8.3-opcache php8.3-curl php8.3-zip php8.3-mbstring php8.3-xml php8.3-gd php8.3-intl php8.3-readline
Перенесите расширения со старой ветки автоматически:
# замените 8.1 на вашу старую ветку и 8.3 на новуюxargs -a /root/php81-packages.txt -r \
bash -lc 'echo "$0" | sed -E "s/php8\.1-/php8.3-/"' \
| xargs -r sudo apt install -y
Debian 12 (bookworm) и 11 (bullseye): добавляем репозиторий Sury и ставим новую ветку
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release apt-transport-https
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://packages.sury.org/php/apt.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/sury-php.gpg
echo "deb [signed-by=/etc/apt/keyrings/sury-php.gpg] https://packages.sury.org/php/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/sury-php.list >/dev/null
sudo apt update
Установите новую ветку (пример — 8.3):
sudo apt install -y php8.3 php8.3-fpm php8.3-cli php8.3-common php8.3-opcache php8.3-curl php8.3-zip php8.3-mbstring php8.3-xml php8.3-gd php8.3-intl php8.3-readline
Перенесите расширения аналогично:
xargs -a /root/php81-packages.txt -r \
bash -lc 'echo "$0" | sed -E "s/php8\.1-/php8.3-/"' \
| xargs -r sudo apt install -y
4) Переключаем веб-сервер на новый php-fpm
Nginx
Проверьте сокет новой ветки:
ls -l /run/php/ | grep php8.3-fpm.sock || true
sudo systemctl enable --now php8.3-fpm
sudo systemctl status php8.3-fpm --no-pager
Откройте ваш серверный блок и убедитесь, что PHP-обработчик указывает на новый сокет:
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
Проверка и перезагрузка:
sudo nginx -t && sudo systemctl reload nginx
Если вы используете TCP вместо сокета:
# /etc/php/8.3/fpm/pool.d/www.conf
# слушать порт:
# listen = 127.0.0.1:9000
sudo systemctl restart php8.3-fpm
# и в nginx:
# fastcgi_pass 127.0.0.1:9000;
sudo nginx -t && sudo systemctl reload nginx
Apache
Рекомендуемый путь — Apache + php-fpm через proxy_fcgi.
Включите модули и направьте .php к новому FPM:
sudo a2enmod proxy proxy_fcgi setenvif
sudo a2enconf php8.3-fpm
sudo systemctl reload apache2
Если используется модуль libapache2-mod-php старой ветки — отключите его и переходите на FPM:
sudo a2dismod php8.1 || true
sudo a2enconf php8.3-fpm
sudo systemctl reload apache2
5) Переключаем PHP CLI на новую версию
Проверьте, какие бинарники есть:
ls -l /usr/bin/php*
Настройте update-alternatives:
sudo update-alternatives --install /usr/bin/php php /usr/bin/php8.3 83
sudo update-alternatives --install /usr/bin/phar phar /usr/bin/phar8.3 83
sudo update-alternatives --install /usr/bin/phar.phar phar.phar /usr/bin/phar.phar8.3 83
sudo update-alternatives --install /usr/bin/phpize phpize /usr/bin/phpize8.3 83
sudo update-alternatives --install /usr/bin/php-config php-config /usr/bin/php-config8.3 83
sudo update-alternatives --set php /usr/bin/php8.3
sudo update-alternatives --set phar /usr/bin/phar8.3
sudo update-alternatives --set phar.phar /usr/bin/phar.phar8.3
sudo update-alternatives --set phpize /usr/bin/phpize8.3
sudo update-alternatives --set php-config /usr/bin/php-config8.3
Проверка:
php -v
php -m | sort | less
Рекомендованные настройки opcache для продакшена
Файл /etc/php/8.3/fpm/php.ini (и при необходимости `/etc/php/8.3/cli/php.ini):
opcache.enable=1
opcache.enable_cli=1
opcache.jit=1255
opcache.jit_buffer_size=64M
opcache.memory_consumption=192
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=100000
opcache.validate_timestamps=0
После правок:
sudo systemctl reload php8.3-fpm
На этапе деплоя не забудьте «прогреть» кэш или сбросить его по окончании релиза
Тестирование - CLI:
php -v
php -r 'echo "OK: ", PHP_VERSION, PHP_EOL;'
FPM через веб:
echo "<?php phpinfo();" | sudo tee /var/www/html/info.php >/dev/null
# откройте в браузере http://SERVER/info.php и убедитесь, что Server API: FPM/FastCGI, версия 8.3.x
# затем удалите файл:sudo rm -f /var/www/html/info.php
Логи:
sudo journalctl -u php8.3-fpm -e --no-pager
sudo tail -n 200 /var/log/nginx/error.log
sudo tail -n 200 /var/log/apache2/error.log
Удаление старой ветки после успешных проверок
Остановите и удалите пакеты старой ветки (пример для 8.1 — поменяйте на вашу):
sudo systemctl stop php8.1-fpm || true
sudo apt purge -y 'php8.1*'
sudo apt autoremove -y
Проверьте, что update-alternatives указывает на 8.3:
php -v
Частые проблемы и решения
- 502 Bad Gateway в Nginx
Причина: Nginx указывает на старый сокет. Проверьте fastcgi_pass и наличие /run/php/php8.3-fpm.sock. Запустите sudo systemctl restart php8.3-fpm и sudo nginx -t && sudo systemctl reload nginx.
- Apache отдает исходный PHP-код
Виртуальный хост не проксирует .php на FPM. Включите proxy и proxy_fcgi, активируйте php8.3-fpm конфиг и перезагрузите Apache.
- Composer ломается из-за недостающих расширений
Сравните php -m с требованиями проекта и установите отсутствующие модули: sudo apt install php8.3-<module>.
- CLI все еще старой версии
Проверьте update-alternatives --config php и установите 8.3. Убедитесь, что нет скриптового шебанга с жестким путем /usr/bin/php8.1.
- Конфигов два, правите не тот
Убедитесь, что редактируете /etc/php/8.3/fpm/php.ini (для веб) и при необходимости /etc/php/8.3/cli/php.ini (для CLI). Перезагружайте соответствующую службу.
Быстрые рецепты под разные сценарии
Обновить только CLI до 8.3, FPM оставить прежним:
sudo apt install -y php8.3-cli php8.3-common
sudo update-alternatives --set php /usr/bin/php8.3
php -v
Поставить 8.2 вместо 8.3:
sudo apt install -y php8.2 php8.2-fpm php8.2-cli
sudo systemctl enable --now php8.2-fpm
sudo sed -i 's#php8\.3-fpm\.sock#php8.2-fpm.sock#g' /etc/nginx/sites-available/* || true
sudo nginx -t && sudo systemctl reload nginx
sudo update-alternatives --set php /usr/bin/php8.2
- Откатиться к старой ветке, если что-то пошло не так:
sudo systemctl stop php8.3-fpm
sudo systemctl start php8.1-fpm
sudo sed -i 's#php8\.3-fpm\.sock#php8.1-fpm.sock#g' /etc/nginx/sites-available/* || true
sudo nginx -t && sudo systemctl reload nginx
sudo update-alternatives --set php /usr/bin/php8.1
- Новая ветка PHP установлена параллельно старой.
- Веб-сервер переключен на новый FPM.
- CLI переведен на новую версию через update-alternatives.
- Расширения мигрированы автоматически.
- Старую ветку можно безопасно удалить после проверки.