Вступление#
PHP 8.2 — это значительное обновление языка PHP, содержащее множество новых функций и оптимизаций. Однако Ubuntu 22.04 LTS включает в свои официальные репозитории только PHP 8.1. В этом руководстве объясняется, как обновить PHP до версии 8.2 и настроить Nginx для его использования.
Предпосылки#
Существующий веб-сайт, работающий с Nginx и PHP 8.1 на сервере Ubuntu 22.04.
Просмотрите руководство по миграции в Руководстве по PHP, чтобы убедиться, что исходный код вашего веб-сайта совместим с PHP 8.2.
1. Список установленных пакетов PHP 8.1#
Войдите на сервер как пользователь sudo без полномочий root через SSH.
Перечислите все пакеты PHP 8.1, установленные в вашей системе.
1
| $ dpkg -l | grep php8.1
|
Вывод выглядит так.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| ii php8.1-cli 8.1.3-4ubuntu2.6 amd64 command-line interpreter for the PHP scripting language
ii php8.1-common 8.1.3-4ubuntu2.6 amd64 documentation, examples and common module for PHP
ii php8.1-curl 8.1.3-4ubuntu2.6 amd64 CURL module for PHP
ii php8.1-fpm 8.1.3-4ubuntu2.6 amd64 server-side, HTML-embedded scripting language (FPM-CGI binary)
ii php8.1-gd 8.1.3-4ubuntu2.6 amd64 GD module for PHP
ii php8.1-json 8.1.3-4ubuntu2.6 amd64 JSON module for PHP
ii php8.1-mbstring 8.1.3-4ubuntu2.6 amd64 MBSTRING module for PHP
ii php8.1-mysql 8.1.3-4ubuntu2.6 amd64 MySQL module for PHP
ii php8.1-opcache 8.1.3-4ubuntu2.6 amd64 Zend OpCache module for PHP
|
Второй столбец содержит имена установленных пакетов.
- Передайте приведенный выше вывод командам
cut
, xargs
и sed
соответственно, чтобы сгенерировать список соответствующих пакетов PHP 8.2.
1
| $ dpkg -l | grep php8.1 | cut -f3 -d' ' | xargs | sed 's/8.1/8.2/g'
|
Результат выглядит следующим образом:
1
| php8.2-cli php8.2-common php8.2-curl php8.2-fpm php8.2-gd php8.2-json php8.2-mbstring php8.2-mysql php8.2-opcache
|
Используйте свой вывод при установке PHP 8.2.
- Сохраните список существующих модулей PHP-FPM 8.1 в файл:
1
| $ php-fpm8.1 -m > ~/php-fpm8.1.modules
|
Вы будете использовать этот файл, чтобы убедиться, что после обновления все модули отсутствуют.
2. Установите пакеты PHP 8.2#
Вы можете установить PHP 8.2 из репозитория ppa:ondrej/php, разработанного Ондржея Сури, который предоставляет последние стабильные версии PHP для систем Ubuntu и Debian.
- Добавьте репозиторий
ppa:ondrej/php
.
1
| $ sudo LC_ALL=C.UTF-8 add-apt-repository -y ppa:ondrej/php
|
- Обновите индекс пакета.
- Смоделируйте установку пакетов PHP 8.2, используя список, созданный в предыдущем разделе.
1
| $ sudo apt --simulate install php8.2-{cli,common,curl,fpm,gd,json,mbstring,mysql,opcache}
|
Если вы получаете такую ошибку:
1
| E: Пакет 'php8.2-json' не имеет кандидата на установку
|
Это означает, что список пакетов содержит виртуальный пакет с именем php8.2-json
.
Вам нужно повторно запустить команду моделирования, но на этот раз удалите виртуальный пакет php8.2-json
из списка пакетов. Повторяйте до тех пор, пока в списке не останется виртуальных пакетов.
- Установите пакеты PHP 8.2 с уточненным списком. Обратите внимание, что команда установки не содержит опции
--simulate
.
1
| $ sudo apt -y install php8.2-{cli,common,curl,fpm,gd,json,mbstring,mysql,opcache}
|
- Сохраните список текущих модулей PHP-FPM 8.2 в файл.
1
| $ php-fpm8.2 -m > ~/php-fpm8.2.modules
|
- Сравните существующие модули PHP-FPM 8.1 с текущими модулями PHP-FPM 8.2.
1
| $ diff ~/php-fpm8.1.modules ~/php-fpm8.2.modules
|
Если вы получаете пустой вывод, это означает, что после обновления не пропало ни одного модуля.
- Убедитесь, что версия PHP по умолчанию в режиме командной строки — 8.2.
3. Настройте Nginx#
Nginx и PHP-FPM 8.1 взаимодействуют друг с другом через сокет, созданный PHP-FPM 8.1. Поэтому, чтобы переключиться на PHP-FPM 8.2, вам нужно настроить новый сокет для PHP-FPM 8.2 и перенастроить Nginx с этим сокетом.
- Найдите сокет, созданный PHP-FPM 8.1, и файл конфигурации Nginx, который использует этот сокет.
1
| $ sudo grep -R fastcgi_pass /etc/nginx/sites-enabled/ | grep -Ev '#\s+fastcgi_pass'
|
Если это сокет Unix, вывод будет выглядеть так:
1
| /etc/nginx/sites-enabled/default: fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
|
Если это сокет TCP, вывод будет выглядеть так:
1
| /etc/nginx/sites-enabled/default: fastcgi_pass 127.0.0.1:9000;
|
В обоих случаях /etc/nginx/sites-enabled/default
— это файл конфигурации Nginx, который вам нужно отредактировать, а /var/run/php/php8.1-fpm.sock
или 127.0.0.1:9000
— это сокет.
У вас может быть другое имя файла или более одного имени файла. Замените default
в следующей команде файлами, найденными в вашей системе.
- Создайте резервную папку для хранения файла конфигурации перед редактированием.
1
| $ sudo mkdir /etc/nginx/sites-backup
|
- Скопируйте все файлы конфигурации в резервную папку.
1
| $ sudo cp -L /etc/nginx/sites-enabled/* /etc/nginx/sites-backup
|
- Отредактируйте файл конфигурации, заменив старый сокет новым.
- Если старым сокетом является
/var/run/php/php8.1-fpm.sock
, новым должен быть /var/run/php/php8.2-fpm.sock
.
1
2
3
4
5
| $ sudo sed -i --follow-symlinks \
's|php8.1-fpm.sock|php8.2-fpm.sock|g' \
/etc/nginx/sites-enabled/default
|
- Если старый сокет — 127.0.0.1:9000, то новый должен быть 127.0.0.1:9001.
1
2
3
4
5
| $ sudo sed -i --follow-symlinks \
's|127.0.0.1:9000|127.0.0.1:9001|g' \
/etc/nginx/sites-enabled/default
|
- Проверьте новую конфигурацию.
Перед применением новой конфигурации вам необходимо выполнить следующий раздел для настройки PHP 8.2.
4. Настройте PHP 8.2#
- Удалите конфигурацию рабочего пула PHP 8.2 по умолчанию.
1
| $ sudo rm /etc/php/8.2/fpm/pool.d/*
|
- Скопируйте конфигурацию из PHP-FPM 8.1 в PHP-FPM 8.2.
1
| $ sudo cp -rL /etc/php/8.1/fpm/pool.d/* /etc/php/8.2/fpm/pool.d/
|
- Найдите файл конфигурации, содержащий определение старого сокета.
- Если старый сокет
/var/run/php/php8.1-fpm.sock
:
1
| $ sudo grep -rl 'php8.1-fpm.sock' /etc/php/8.2/fpm/pool.d
|
- Если старый сокет
127.0.0.1:9000
:
1
| $ sudo grep -rl '127.0.0.1:9000' /etc/php/8.2/fpm/pool.d
|
В обоих случаях результаты одинаковы, примерно так:
1
| /etc/php/8.2/fpm/pool.d/www.conf
|
- Отредактируйте файл конфигурации, заменив старый сокет новым.
- Если старый сокет
/var/run/php/php8.1-fpm.sock
:
1
| $ sudo sed -i 's|php8.1-fpm.sock|php8.2-fpm.sock|g' /etc/php/8.2/fpm/pool.d/www.conf
|
- Если старый сокет
127.0.0.1:9000
:
1
| $ sudo sed -i 's|127.0.0.1:9000|127.0.0.1:9001|g' /etc/php/8.2/fpm/pool.d/www.conf
|
- Вам также может понадобиться настроить некоторые параметры в основном файле конфигурации PHP 8.2, чтобы они соответствовали требованиям вашего веб-сайта. Общие настройки для большинства веб-сайтов PHP:
1
2
3
4
5
6
7
8
9
| max_execution_time
memory_limit
post_max_size
upload_max_filesize
date.timezone
|
Вы можете найти необходимые настройки в основном файле конфигурации PHP 8.1 /etc/php/8.1/fpm/php.ini
, а затем скопировать эти настройки в основной файл конфигурации PHP 8.2 /etc/php/8.2/fpm/php.ini
.
- Проверьте новую конфигурацию.
- Перезагрузите службу PHP-FPM 8.2, чтобы применить изменения.
1
| $ sudo systemctl reload php8.2-fpm.service
|
- Перезагрузите службу Nginx, чтобы ваш сайт работал с PHP 8.2 вместо 8.1.
1
| $ sudo systemctl reload nginx.service
|
- Отключите службу PHP-FPM 8.1.
1
| $ sudo systemctl disable --now php8.1-fpm.service
|
5. Проверьте установку#
Откройте свой сайт в браузере. Протестируйте и убедитесь, что все функции работают должным образом.
Если вы решили удалить PHP 8.1, сделайте следующее:
- Удалите папку резервной копии Nginx.
1
| $ sudo rm -fr /etc/nginx/sites-backup
|
- Удалите все пакеты PHP 8.1.
1
| $ sudo apt -y purge php8.1*
|
Если вам понравился этот пост о том, как установить PHP 8.2 на Ubuntu 22.04, поделитесь им с друзьями в социальных сетях. Спасибо.