Пятница, 09.08.2024 22:44

Упаковываем PHP 8.3.10 в DEB. Собираем PHP 8.3 из исходного кода в Debian 12 Bookworm. Часть 2.

Упаковываем PHP 8.3.10 в DEB. Собираем PHP 8.3 из исходного кода в Debian 12 Bookworm. Часть 2.

Сборка из исходного кода позволяет нам получить последнюю версию программного обеспечения, которая будет максимально совместима с нашей версией Linux. При этом с могут возникнуть проблемы с переносом новой версии на другие ПК или сервера, так как помимо копирования файлов, может потребоваться создание служб, и/или симлинков для исполняемых файлов и прочие настройки.

Чтобы решить все эти проблемы были созданы пакетные менеджеры, наиболее известные из них это dpkg и rpm.

В Debian используется dpkg и сегодня мы рассмотрим упаковку собранного PHP 8.3.10 в deb-пакет.

Далее я подразумеваю, что вы уже прошли все этапы из первой части.

Упаковываем PHP 8.3.10 в DEB

Настройка виртуальных машин

Нам потребуется еще одна чистая виртуальная машина для тестирования полученных пакетов.

Таким образом у меня получается две виртуальных машины:

192.168.1.36 – виртуальная машина для сборки пакетов.

192.168.1.38 – тестовая виртуальная машина.

Тестовая виртуальная машина – свежеустановленный Debian без дополнительных установленных пакетов – это очень важно, таким образом вы можете быть уверены, что при тестировании не упустите важные зависимости в собираемых пакетах.

Создание SSH-ключей

Создадим ssh-ключ для копирования файлов на тестовую машину без пароля.

На виртуальной машине для сборки (192.168.1.36) запустим:

ssh-keygen -f ~/.ssh/testvm
Generating public/private rsa key pair.
Created directory '/home/user/.ssh'.

Вообще это плохая идея – использовать ключи без пароля, так как сами по себе ключи в, плане безопасности и есть пароль. Любой, кто завладеет этим файлом получит полный доступ к вашему серверу! 

Но так как мы работаем в среде разработки, локально и на виртуальных машинах, в данном случае этим можно пренебречь.

На запрос пароля нажмем Enter. 

Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/testvm
Your public key has been saved in /home/user/.ssh/testvm.pub
The key fingerprint is:
SHA256:69xAiGI0Yr24O2GsQRx9mpU+aCUrSMyNu4JbXt3dS9U user@debian-build
The key's randomart image is:
+---[RSA 3072]----+
|o +   .          |
| *.+ =           |
|=.=.@          . |
|oB.B.+ .      . E|
|+.*...o.S. . .   |
|+*o.. ..... o    |
|+*..    o  . .   |
|o.o    o o  .    |
| ..     o .      |
+----[SHA256]-----+

Будет создан файл 

~/.ssh/testvm

Скопируем ключ на тестовый сервер (192.168.1.38):

ssh-copy-id -i ~/.ssh/testvm.pub user@192.168.1.38
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/testvm.pub"
The authenticity of host '192.168.1.38 (192.168.1.38)' can't be established.
ED25519 key fingerprint is SHA256:EVdMNIjSPYA61+h4Z0PVyHN17mxnPd3Z3f2WG/BONbs.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

На запрос введем:

yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
user@192.168.1.38's password:

Введем пароль от пользователя на тестовом сервере:

Number of key(s) added: 1
Now try logging into the machine, with:   "ssh 'user@192.168.1.38'"
and check to make sure that only the key(s) you wanted were added.

Проверим работоспособность:

ssh user@192.168.1.38 -i ~/.ssh/testvm
Linux debian-test 6.1.0-23-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.99-1 (2024-07-15) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Aug  6 05:36:53 2024 from 192.168.1.36

Все работает.

Выйдем:

exit
logout
Connection to 192.168.1.38 closed.

Попробуем скопировать файл на тестовый сервер:

scp -i ~/.ssh/testvm /var/www/html/test.php user@192.168.1.38:/home/user
test.php                                      100%   25    63.0KB/s   00:00

Проверим, зайдем на удаленный сервер

ssh user@192.168.1.38 -i ~/.ssh/testvm

Введем

ls
test.php

Проверим содержимое файла:

cat test.php
<?php echo phpinfo(); ?>

Файл был успешно скопирован, теперь мы сможем без проблем копировать собранные пакеты на тестовый сервер.

Выйдем с удаленного сервера:

exit
logout
Connection to 192.168.1.38 closed.

Собираем php для упаковки в .deb-пакет

Для упаковки в .deb-пакет нам нужно внести изменения в конфигурацию сборки таким образом, чтобы при установке копирование производилось не в папку /usr/local

Для этого внесем изменения в файл конфигурирования php, приведем файл к виду:

./buildconf --force
./configure --with-config-file-path=/opt/php-8.3.10/etc \
--sysconfdir=/opt/php-8.3.10/etc \
--enable-mysqlnd \
--with-pdo-mysql \
--with-pdo-mysql=mysqlnd \
--with-pdo-pgsql=/usr/bin/pg_config \
--enable-bcmath \
--enable-fpm \
--with-fpm-user=www-data \
--with-fpm-group=www-data \
--enable-mbstring \
--enable-phpdbg \
--enable-shmop \
--enable-sockets \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--with-zlib \
--with-curl \
--with-pear \
--with-openssl \
--enable-pcntl \
--enable-gd \
--with-jpeg \
--with-mysqli \
--with-readline \
--with-freetype \
--with-ldap \
--prefix=/opt/php-8.3.10/

Таким образом, устанавливать собранный PHP мы будем в папку /opt что позволит избежать в будущем целого ряда проблем.

Сохраним и запустим конфигурирование, сборку и установку:

./configure.sh
make
sudo make install

В папку /opt/php-8.3.10 будет установлен собранный PHP 8.3.10

Скопируем в папку файлы конфигурации:

sudo cp php.ini-development /opt/php-8.3.10/etc/php.ini
sudo cp /opt/php-8.3.10/etc/php-fpm.conf.default /opt/php-8.3.10/etc/php-fpm.conf
sudo cp /opt/php-8.3.10/etc/php-fpm.d/www.conf.default /opt/php-8.3.10/etc/php-fpm.d/www.conf

Скопируем созданные файлы в папку для сборки:

sudo mkdir -p /opt/build/php-8.3.10/opt/php-8.3.10
sudo cp -ar /opt/php-8.3.10 /opt/build/php-8.3.10/opt

Для сборки пакета нам нужно создать папку и несколько файлов, которые будут описывать свойства нашего пакета.

Создадим папку:

sudo mkdir -p /opt/build/php-8.3.10/DEBIAN

Создадим файл:

sudo mcedit /opt/build/php-8.3.10/DEBIAN/control

С содержимым:

Package: php-8.3.10
Version: 8.3.10
License: PHP License v3.01
Vendor: Локальная компания
Architecture: amd64
Maintainer: <admin@localcompany.ru>
Description: PHP 8.3.10 всё в одном

Обратите внимание, в файле обязательно должна быть пустая строка в конце файла!

В данном файле содержится информация о пакете.

Package: php-8.3.10

В этой строке указывается имя пакета, которое будет использоваться при установке с помощью apt. В нашем случае, при установке из репозитория команда будет выглядеть так:

sudo apt install php-8.3.10

Остальные строки описывают дополнительную информацию о пакете.

Создадим скрипт для запуска сборки:

sudo mcedit /opt/build/build.sh

С содержимым:

dpkg-deb --build /opt/build/php-8.3.10 /opt/build/php-8.3.10.deb

Запустим:

sudo chmod +x /opt/build/build.sh
sudo /opt/build/build.sh

Будет создан файл:

/opt/build/php-8.3.10.deb

Скопируем на тестовый сервер

scp -i ~/.ssh/testvm /opt/build/php-8.3.10.deb user@192.168.1.38:/home/user
php-8.3.10.deb                                100%   49MB 309.2MB/s   00:00

Перейдем на тестовый сервер и запустим:

su
apt-get install sudo
sudo dpkg -i /home/user/php-8.3.10.deb

Проверим

/opt/php-8.3.10/bin/php -v
/opt/php-8.3.10/bin/php: error while loading shared libraries: libpq.so.5: cannot open shared object file: No such file or directory

Мы получили ошибку, так как собранный PHP 8.3.10 зависит от внешних динамически подключаемых библиотек, которых нет на тестовом сервере! Нам нужно установить все библиотеки, что использовались при сборке проекта!

Вернемся на сервер сборки.

В файл /opt/build/php-8.3.10/DEBIAN/control

sudo mcedit /opt/build/php-8.3.10/DEBIAN/control

Добавим строку

Depends: libcurl4, libxml2, libreadline8, libzip4, openssl, zlib1g, sqlite3, libonig5, libpq5, libpng16-16, libldap-2.5-0, libfreetype6, libjpeg62

Давайте сразу модифицируем скрипт сборки, для копирования собранного пакета на удаленный сервер.

Чтобы иметь возможность копировать пакет от пользователя root скопируем ключ в его папку:

sudo cp ~/.ssh/testvm /root/.ssh/

Запустим:

sudo mcedit /opt/build/build.sh

Добавим в конец файла строку:

scp -i ~/.ssh/testvm /opt/build/php-8.3.10.deb user@192.168.1.38:/home/user

Сохраним и выйдем.

Запустим:

sudo /opt/build/build.sh

Пакет будет пересобран и скопирован на тестовый сервер:

dpkg-deb: building package 'php-8.3.10' in '/opt/build/php-8.3.10.deb'.
php-8.3.10.deb                                100%   49MB 331.2MB/s   00:00

Перейдем на тестовый сервер и запустим:

sudo dpkg -i php-8.3.10.deb
(Reading database ... 33563 files and directories currently installed.)
Preparing to unpack php-8.3.10.deb ...
Unpacking php-8.3.10 (8.3.10) over (8.3.10) ...
dpkg: dependency problems prevent configuration of php-8.3.10:
php-8.3.10 depends on libcurl4; however:
 Package libcurl4 is not installed.
php-8.3.10 depends on libzip4; however:
 Package libzip4 is not installed.
php-8.3.10 depends on sqlite3; however:
 Package sqlite3 is not installed.
php-8.3.10 depends on libonig5; however:
 Package libonig5 is not installed.
php-8.3.10 depends on libpq5; however:
 Package libpq5 is not installed.
php-8.3.10 depends on libjpeg62; however:
 Package libjpeg62 is not installed.

dpkg: error processing package php-8.3.10 (--install):
dependency problems - leaving unconfigured
Errors were encountered while processing:
php-8.3.10

Это нормальная ситуация, так как dpkg не умеет устанавливать зависимости.

Запустим

sudo apt-get install /home/user/php-8.3.10.deb
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
You might want to run 'apt --fix-broken install' to correct these.
The following packages have unmet dependencies:
php-8.3.10 : Depends: libcurl4 but it is not installed
             Depends: libzip4 but it is not installed
             Depends: sqlite3 but it is not installed
             Depends: libonig5 but it is not installed
             Depends: libpq5 but it is not installed
             Depends: libjpeg62
E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution).

Это тоже нормально, так как мы ставим из deb-пакета, а не из репозитория!

Запустим:

apt install -f
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Correcting dependencies... Done
The following additional packages will be installed:
 libcurl4 libjpeg62-turbo libonig5 libpq5 libzip4 sqlite3
Suggested packages:
 sqlite3-doc
The following NEW packages will be installed:
 libcurl4 libjpeg62-turbo libonig5 libpq5 libzip4 sqlite3
0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded.
1 not fully installed or removed.
Need to get 1,341 kB of archives.
After this operation, 3,801 kB of additional disk space will be used.
Do you want to continue? [Y/n] y

Будут установлены все указанные в зависимостях пакеты!

Если вы будете собирать php с дополнительными опциями, вам придется добавить и дополнительные библиотеки, которые нужны для расширений php!

Попробуем снова запустить:

/opt/php-8.3.10/bin/php -v
PHP 8.3.10 (cli) (built: Aug  6 2024 05:44:44) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.10, Copyright (c) Zend Technologies

Все отрабатывает на отлично.

Запускаем скрипт после установки deb-пакета

Мы успешно установили PHP 8.3.10 и все зависимости, но осталась еще одна важная часть – создание службы для php-fpm.

Создаем скрипт postinst

Перейдем на сервер сборки.

Создадим файл:

sudo mcedit /opt/build/php-8.3.10/DEBIAN/postinst

С содержимым:

set -e

case "$1" in
   configure)

    cat > /lib/systemd/system/php-8.3.10-fpm.service << EOL
[Unit]
Description=The PHP 8.3.10 FastCGI Process Manager
After=network.target

[Service]
Type=simple
PIDFile=/var/run/php-8.3.10-fpm.pid
ExecStart=/opt/php-8.3.10/sbin/php-fpm --nodaemonize --fpm-config /opt/php-8.3.10/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target
EOL
sudo systemctl enable php-8.3.10-fpm.service
sudo systemctl daemon-reload
sudo systemctl start php-8.3.10-fpm.service
   ;;

   abort-upgrade|abort-remove|abort-deconfigure)
       exit 0
   ;;

   *)
       echo "postinst called with unknown argument \`$1'" >&2
       exit 1
   ;;
esac

Сделаем его исполняемым:

sudo chmod 775 /opt/build/php-8.3.10/DEBIAN/postinst

Запустим сборку:

sudo /opt/build/build.sh

Перейдем на тестовый сервер и запустим:

su
sudo apt-get remove php-8.3.10
sudo apt-get install /home/user/php-8.3.10.deb
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Note, selecting 'php-8.3.10' instead of '/home/user/php-8.3.10.deb'
The following NEW packages will be installed:
 php-8.3.10
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/50.9 MB of archives.
After this operation, 0 B of additional disk space will be used.
Get:1 /home/user/php-8.3.10.deb php-8.3.10 amd64 8.3.10 [50.9 MB]
Selecting previously unselected package php-8.3.10.
(Reading database ... 33177 files and directories currently installed.)
Preparing to unpack /home/user/php-8.3.10.deb ...
Unpacking php-8.3.10 (8.3.10) ...
Setting up php-8.3.10 (8.3.10) ...
Created symlink /etc/systemd/system/multi-user.target.wants/php-8.3.10-fpm.service → /lib/systemd/system/php-8.3.10-fpm.service.
N: Download is performed unsandboxed as root as file '/home/user/php-8.3.10.deb' couldn't be accessed by user '_apt'. - pkgAcquire::Run (13: Permission denied)

Оповещение в конце можно проигнорировать.

Проверим статус службы:

sudo systemctl status php-8.3.10-fpm.service
● php-8.3.10-fpm.service - The PHP 8.3.10 FastCGI Process Manager
    Loaded: loaded (/lib/systemd/system/php-8.3.10-fpm.service; enabled; preset: enabled)
    Active: active (running) since Wed 2024-08-07 01:19:02 EDT; 8s ago
  Main PID: 2433 (php-fpm)
     Tasks: 3 (limit: 1020)
    Memory: 14.7M
       CPU: 21ms
    CGroup: /system.slice/php-8.3.10-fpm.service
            ├─2433 "php-fpm: master process (/opt/php-8.3.10/etc/php-fpm.conf)"
            ├─2435 "php-fpm: pool www"
            └─2436 "php-fpm: pool www"

Служба запустилась.

Создаем симлинки для PHP 8.3.10

Чтобы прочие приложения могли без проблем найти установленный PHP давайте создадим симлинки.

Добавим в файл:

sudo mcedit /opt/build/php-8.3.10/DEBIAN/postinst

Строки, приведя его к виду:

set -e

case "$1" in
   configure)

    cat > /lib/systemd/system/php-8.3.10-fpm.service << EOL
[Unit]
Description=The PHP 8.3.10 FastCGI Process Manager
After=network.target

[Service]
Type=simple
PIDFile=/var/run/php-8.3.10-fpm.pid
ExecStart=/opt/php-8.3.10/sbin/php-fpm --nodaemonize --fpm-config /opt/php-8.3.10/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target
EOL


ln -s -f /opt/php-8.3.10/bin/pear /usr/local/bin
ln -s -f /opt/php-8.3.10/bin/peardev /usr/local/bin
ln -s -f /opt/php-8.3.10/bin/pecl /usr/local/bin
ln -s -f /opt/php-8.3.10/bin/phar /usr/local/bin
ln -s -f /opt/php-8.3.10/bin/phar.phar /usr/local/bin
ln -s -f /opt/php-8.3.10/bin/php /usr/local/bin
ln -s -f /opt/php-8.3.10/bin/php-cgi /usr/local/bin
ln -s -f /opt/php-8.3.10/bin/php-config /usr/local/bin
ln -s -f /opt/php-8.3.10/bin/phpdbg /usr/local/bin
ln -s -f /opt/php-8.3.10/bin/phpize /usr/local/bin
ln -s -f /opt/php-8.3.10/sbin/php-fpm /usr/local/sbin/


sudo systemctl enable php-8.3.10-fpm.service
sudo systemctl daemon-reload
sudo systemctl start php-8.3.10-fpm.service
   ;;

   abort-upgrade|abort-remove|abort-deconfigure)
       exit 0
   ;;

   *)
       echo "postinst called with unknown argument \`$1'" >&2
       exit 1
   ;;
esac

Запустим сборку пакета:

sudo /opt/build/build.sh

На тестовой машине переустановим:

sudo apt-get --yes remove php-8.3.10
sudo apt-get --yes install /home/user/php-8.3.10.deb

Проверим:

ls /usr/local/bin
pear  peardev  pecl  phar  phar.phar  php  php-cgi  php-config  phpdbg  phpize
whereis php
php: /usr/local/bin/php /opt/php-8.3.10/bin/php
php -v
PHP 8.3.10 (cli) (built: Aug  6 2024 23:18:43) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.10, Copyright (c) Zend Technologies
sudo systemctl status php-8.3.10-fpm.service

Служба тоже запущена!

Заключение

Сегодня мы рассмотрели упаковку в deb-пакет, собранного из исходного кода PHP 8.3.10:

Подготовили систему к сборке;

Настроили дополнительную виртуальную машину, для тестирования пакета;

Создали SSH-ключи и распространили их на тестовый сервер;

Проверили и настроили копирования файлов на тестовый сервер используя SCP;

Внесли изменения в файл конфигурирования сборки PHP, для установки в папку /opt

Запустили конфигурирования и произвели пересборку с новыми параметрами;

Скопировали собранные файлы в папку для сборки deb-пакета;

Создали папку DEBAIN и файл control с описанием пакета;

Создали скрипт для сборки пакета;

Собрали пакет и скопировали его на тестовый сервер;

Провели тестовую установку пакета и обнаружили проблемы с зависимостями;

Внесли изменения в файл control, добавив строку с описанием зависимостей;

Внесли изменения в скрипт сборки пакета, для автоматического копирования собранного пакета на тестовый сервер;

Запустили установку и проверили работоспособность;

Добавили скрипт DEBIAN/postinst для создания сервиса php-fpm и симлинков до исполняемых файлов php;

Произвели сборку и тестирование пакета;

Категория Debian
Теги PHP php83 Debian

Добавить комментарий

Простой текст

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Строки и абзацы переносятся автоматически.
  • Адреса веб-страниц и email-адреса преобразовываются в ссылки автоматически.
Просмотров: 146