Вступление

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

  1. Войдите на сервер как пользователь sudo без полномочий root через SSH.

  2. Перечислите все пакеты 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

Второй столбец содержит имена установленных пакетов.

  1. Передайте приведенный выше вывод командам 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.

  1. Сохраните список существующих модулей 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.

  1. Добавьте репозиторий ppa:ondrej/php.
1
$ sudo LC_ALL=C.UTF-8 add-apt-repository -y ppa:ondrej/php
  1. Обновите индекс пакета.
1
$ sudo apt update
  1. Смоделируйте установку пакетов 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 из списка пакетов. Повторяйте до тех пор, пока в списке не останется виртуальных пакетов.

  1. Установите пакеты PHP 8.2 с уточненным списком. Обратите внимание, что команда установки не содержит опции --simulate.
1
$ sudo apt -y install php8.2-{cli,common,curl,fpm,gd,json,mbstring,mysql,opcache}
  1. Сохраните список текущих модулей PHP-FPM 8.2 в файл.
1
$ php-fpm8.2 -m > ~/php-fpm8.2.modules
  1. Сравните существующие модули PHP-FPM 8.1 с текущими модулями PHP-FPM 8.2.
1
$ diff ~/php-fpm8.1.modules ~/php-fpm8.2.modules

Если вы получаете пустой вывод, это означает, что после обновления не пропало ни одного модуля.

  1. Убедитесь, что версия PHP по умолчанию в режиме командной строки — 8.2.
1
$ php -v

3. Настройте Nginx

Nginx и PHP-FPM 8.1 взаимодействуют друг с другом через сокет, созданный PHP-FPM 8.1. Поэтому, чтобы переключиться на PHP-FPM 8.2, вам нужно настроить новый сокет для PHP-FPM 8.2 и перенастроить Nginx с этим сокетом.

  1. Найдите сокет, созданный 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. Создайте резервную папку для хранения файла конфигурации перед редактированием.
1
$ sudo mkdir /etc/nginx/sites-backup
  1. Скопируйте все файлы конфигурации в резервную папку.
1
$ sudo cp -L /etc/nginx/sites-enabled/* /etc/nginx/sites-backup
  1. Отредактируйте файл конфигурации, заменив старый сокет новым.
  • Если старым сокетом является /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
  1. Проверьте новую конфигурацию.
1
$ sudo nginx -t

Перед применением новой конфигурации вам необходимо выполнить следующий раздел для настройки PHP 8.2.

4. Настройте PHP 8.2

  1. Удалите конфигурацию рабочего пула PHP 8.2 по умолчанию.
1
$ sudo rm /etc/php/8.2/fpm/pool.d/*
  1. Скопируйте конфигурацию из 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/
  1. Найдите файл конфигурации, содержащий определение старого сокета.
  • Если старый сокет /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
  1. Отредактируйте файл конфигурации, заменив старый сокет новым.
  • Если старый сокет /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
  1. Вам также может понадобиться настроить некоторые параметры в основном файле конфигурации 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.

  1. Проверьте новую конфигурацию.
1
$ sudo php-fpm8.2 -t
  1. Перезагрузите службу PHP-FPM 8.2, чтобы применить изменения.
1
$ sudo systemctl reload php8.2-fpm.service
  1. Перезагрузите службу Nginx, чтобы ваш сайт работал с PHP 8.2 вместо 8.1.
1
$ sudo systemctl reload nginx.service
  1. Отключите службу PHP-FPM 8.1.
1
$ sudo systemctl disable --now php8.1-fpm.service

5. Проверьте установку

Откройте свой сайт в браузере. Протестируйте и убедитесь, что все функции работают должным образом.

Если вы решили удалить PHP 8.1, сделайте следующее:

  1. Удалите папку резервной копии Nginx.
1
$ sudo rm -fr /etc/nginx/sites-backup
  1. Удалите все пакеты PHP 8.1.
1
$ sudo apt -y purge php8.1*

Если вам понравился этот пост о том, как установить PHP 8.2 на Ubuntu 22.04, поделитесь им с друзьями в социальных сетях. Спасибо.