Как обновить PHP на Ubuntu и Debian 列印

  • php, php update, debian, ubuntu, vps, администрирование
  • 0

Обновление 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.
- Расширения мигрированы автоматически.
- Старую ветку можно безопасно удалить после проверки.


這篇文章有幫助嗎?

相關文章

Как использовать свои подсети /24 на серверах Hetzner. Использование на Windows Server   Hetzner выдаёт только один белый IP. Хочется RDP на несколько ВМ, собственный почтовый пул или... Какие есть боты/сервисы, которые стоит добавить в исключения? Практический гайд для защиты сайта и бизнеса В современных условиях кибербезопасности настройка блокировок и фильтров — обязательная мера для... Какие есть боты/сервисы, которые стоит добавить в исключения? Практический гайд для защиты сайта и бизнеса В современных условиях кибербезопасности настройка блокировок и фильтров — обязательная мера для... Что делать, если сертификаты Let’s Encrypt не обновляются? Простое решение за 5 минут Сертификаты от Let’s Encrypt стали стандартом для бесплатной автоматической защиты сайтов по... Какие сервисы и решения реально помогают? Топ-10 инструментов Почему взламывают сайты и что самое опасное? Современный сайт на WordPress, Битрикс, Joomla,...
« 返回

Powered by WHMCompleteSolution


知識庫