opened image

Как установить PHP 8.4, 7.4 и другие на Debian 13

Руководство по установке нескольких версий PHP на Debian 13 (trixie) из репозитория Sury, с параллельной установкой разных веток и подключением к Apache через libapache2-mod-php (без PHP‑FPM).

 

 

Установка из репозитория Sury

 

Официальный репозиторий Debian 13 предоставляет актуальную ветку PHP (на момент релиза — 8.4). Репозиторий Sury нужен, если:

 

  • вам требуется несколько версий (например, 8.4 + 8.2 для разных проектов);

  • нужны устаревшие ветки (с рисками) или дополнительные сборки/модули;

  • вы хотите быстрее получать минорные/патч‑обновления.

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

 

 

Предварительные условия

 

sudo apt update
sudo apt install -y curl ca-certificates gnupg lsb-release apache2

 

Проверьте кодовое имя ОС:

lsb_release -sc   # должно вывести: trixie

 

 

Добавляем репозиторий PHP Sury для Debian 13 trixie

 

# 2.1 Импорт ключа и подготовка каталога ключей
sudo install -m 0755 -d /usr/share/keyrings
curl -fsSL https://packages.sury.org/php/apt.gpg \
  | sudo gpg --dearmor -o /usr/share/keyrings/sury-php.gpg

# 2.2 Подключаем репозиторий Sury именно для trixie
echo "deb [signed-by=/usr/share/keyrings/sury-php.gpg] https://packages.sury.org/php/ trixie main" \
  | sudo tee /etc/apt/sources.list.d/sury-php.list

# 2.3 Обновляем индексы
sudo apt update

 

Важно: не используйте bookworm на Debian 13 — иначе смешаете репозитории разных релизов.

 

 

Установка нескольких версий PHP

 

PHP‑CLI для всех нужных веток

sudo apt install -y php8.4 php8.3 php8.2
php -v  # покажет текущий CLI по умолчанию

 

Базовые модули (подберите по задачам)

Устанавливаем apache-модули для нужных веток (без FPM). В один момент времени Apache может использовать только один модуль libapache2-mod-php*, но пакеты нескольких версий можно держать установленными параллельно.

 

sudo apt install -y \
  libapache2-mod-php8.4 php8.4-cli php8.4-mysql php8.4-xml php8.4-curl php8.4-mbstring php8.4-zip php8.4-gd \
  libapache2-mod-php8.3 php8.3-cli php8.3-mysql php8.3-xml php8.3-curl php8.3-mbstring php8.3-zip php8.3-gd \
  libapache2-mod-php8.2 php8.2-cli php8.2-mysql php8.2-xml php8.2-curl php8.2-mbstring php8.2-zip php8.2-gd

 

 

Активация нужной версии в Apache (переключение между модулями)

# Пример: включить PHP 8.4 в Apache
sudo a2dismod php8.2 php8.3 2>/dev/null || true
sudo a2enmod  php8.4
sudo systemctl reload apache2

# Переключиться на PHP 8.3
sudo a2dismod php8.4 php8.2 2>/dev/null || true
sudo a2enmod  php8.3
sudo systemctl reload apache2

# Переключиться на PHP 8.2
sudo a2dismod php8.4 php8.3 2>/dev/null || true
sudo a2enmod  php8.2
sudo systemctl reload apache2

 

Список активных модулей: apache2ctl -M | grep php.

 

 

Переключение версии для CLI (php в терминале)

sudo update-alternatives --config php
# при необходимости также
sudo update-alternatives --config phar
sudo update-alternatives --config phar.phar

 

Проверьте:

php -v

Клиентская версия CLI не влияет на то, какую версию использует Apache — это настраивается модулем libapache2-mod-phpX.Y.

 

 

Apache + libapache2-mod-php

 

Apache загружает модуль libapache2-mod-phpX.Y, который обрабатывает .php внутри самого веб‑сервера. Это просто и быстро для одиночного хоста.

 

Виртуальные хосты (базовая схема)

 

При использовании libapache2-mod-php дополнительный SetHandler не требуется — обработка PHP включается самим модулем.

Достаточно стандартного vhost:

<VirtualHost *:80>
    ServerName app.example
    DocumentRoot /var/www/app/public

    <Directory /var/www/app/public>
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog  ${APACHE_LOG_DIR}/app-error.log
    CustomLog ${APACHE_LOG_DIR}/app-access.log combined
</VirtualHost>

 

Активируйте сайт и перезагрузите Apache:

sudo a2ensite app.example.conf
sudo systemctl reload apache2

Напоминание: одновременно может быть активен только один модуль phpX.Y для всего Apache. Для разных проектов с разными версиями на одном Apache без FPM это ограничение не обойти.

 

 

Nginx (замечание)

В связке с Nginx обработка PHP выполняется только через FastCGI (обычно PHP‑FPM). Поскольку в этой инструкции FPM не используем, Nginx здесь не рассматривается.

 

 

Типовые модули и php.ini

 

Список установленных модулей

php8.4 -m | sort
php8.3 -m | sort
php8.2 -m | sort

 

 

Настройка php.ini

 

Файлы для Apache‑SAPI:

  • /etc/php/8.4/apache2/php.ini

  • /etc/php/8.3/apache2/php.ini

  • /etc/php/8.2/apache2/php.ini

 

Часто меняют:

memory_limit = 256M
upload_max_filesize = 50M
post_max_size = 50M
max_execution_time = 60

 

После изменений перезагрузите Apache:

sudo systemctl reload apache2

 

Пер‑сайтные настройки

С libapache2-mod-php тонкие лимиты на сайт обычно задают через .htaccess или <Directory>/<VirtualHost> (директивы php_value, php_flag), либо через отдельные php.ini и PHPINIDir при необходимости.

 

 

Проверка работы

CLI

php -v
php8.4 -v
php8.3 -v
php8.2 -v

 

Через Apache (mod_php)

echo '<?php phpinfo(); ?>' | sudo tee /var/www/app/public/info.php >/dev/null
curl -s http://app.example/info.php | head

Страница должна показывать активную версию PHP, соответствующую включённому модулю phpX.Y.

 

 

Обновления и приоритеты

  • Обновляйте пакеты регулярно:

    sudo apt update && sudo apt upgrade
    
  • Если хотите, чтобы пакеты PHP предпочитались из Sury, настройте APT Pinning:

    sudo tee /etc/apt/preferences.d/99-sury <<'EOF'
    Package: *
    Pin: origin packages.sury.org
    Pin-Priority: 700
    EOF
    

    Проверьте приоритеты: apt-cache policy php8.4.

 

 

Безопасность и эксплуатация

 

  • Оставляйте активным только один модуль PHP: лишние версии держите установленными, но выключенными (a2dismod).

  • Минимизируйте набор расширений: ставьте модули только для используемой версии.

  • Следите за open_basedir, disable_functions и правами на файлы/каталоги.

  • Удаляйте info.php после проверки.

  • Для проектов, требующих разных версий одновременно, рассмотрите изоляцию по vhost’ам на разных Apache-инстансах, контейнерах или переход на FPM.

 

 

 

Устранение неполадок

 

  • PHP не обрабатывается (скачивается файл): модуль не активен. Проверьте apache2ctl -M | grep php и включите нужный a2enmod phpX.Y.

  • Не та версия в вебе: отключите старый модуль a2dismod php*, включите нужный a2enmod phpX.Y, затем systemctl reload apache2.

  • CLI показывает другую версию: переключите через update-alternatives --config php.

  • Конфликты директив: проверьте .htaccess и <Directory>. Для критичных настроек используйте виртуальные хосты.

  • Модули «не видны»: ставьте расширение именно для используемой ветки (php8.3-xmlphp-xml).

 

 

Чек‑лист запуска в продакшн

 

  • В репозиториях подключён Sury для trixie (правильное кодовое имя).

  • Установлены требуемые версии PHP и соответствующие libapache2-mod-phpX.Y.

  • Активен ровно один модуль PHP в Apache (a2enmod phpX.Y), ненужные отключены (a2dismod).

  • Виртуальные хосты развернуты, AllowOverride/Rewrite настроены.

  • Страницы phpinfo() проверены и удалены.

  • Логи и мониторинг Apache/модулей включены.

 

 

Итоги

 

Репозиторий Sury на Debian 13 (trixie) позволяет держать несколько версий PHP параллельно и быстро переключаться между ними в CLI и на уровне Apache через libapache2-mod-php (без использования PHP‑FPM).

Помните об ограничении: Apache может загружать только один модуль PHP одновременно. Для сценариев, где проекты требуют разные версии одновременно на одном хосте, используйте изоляцию (отдельные инстансы/контейнеры) — либо переходите на FPM.