Установка phpMyAdmin с Nginx на Debian 13, 12, 11: полное руководство

phpMyAdmin — это популярное веб-приложение для управления базами данных MariaDB/MySQL через графический интерфейс. Оно позволяет создавать и удалять базы данных, выполнять SQL-запросы, управлять пользователями и привилегиями, импортировать и экспортировать данные без использования командной строки.

В этом руководстве я покажу установку phpMyAdmin с Nginx на Debian 13, 12 и 11 из официального архива upstream (а не из репозитория Debian), чтобы получить последнюю версию и удобную для Nginx структуру каталогов.


Оглавление

1. 🔧 Предварительные требования

Перед установкой убедитесь, что:

  • У вас есть доменное имя (рекомендуется) или IP-адрес
  • Вы имеете права sudo (администратора)

⚠️ ВАЖНО: Проверьте права sudo перед установкой

Если вы не уверены, есть ли у вашего пользователя права администратора, выполните в терминале:

sudo whoami

Что делает: sudo — выполняет команду от имени суперпользователя; whoami — показывает имя текущего пользователя.

✅ Если выводит root — всё в порядке, можете продолжать.

❌ Если выводит is not in the sudoers file — сначала пройдите наше руководство по настройке sudo.


2. 📦 Установка LEMP-стека (Nginx, MariaDB, PHP)

Шаг 1: Обновите систему

sudo apt update && sudo apt upgrade -y

Шаг 2: Установите Nginx, MariaDB, PHP и необходимые расширения

sudo apt install -y nginx mariadb-server mariadb-client php-fpm php-mbstring php-bcmath php-xml php-mysql php-common php-gd php-cli php-curl php-zip curl ca-certificates gpg openssl

Что делают основные пакеты:

  • nginx — веб-сервер
  • mariadb-server и mariadb-client — база данных
  • php-fpm — обработчик PHP (версия будет автоматически выбрана под ваш Debian: 8.4 для Debian 13, 8.2 для Debian 12, 7.4 для Debian 11)
  • php-mysql, php-mbstring, php-xml, php-curl, php-zip, php-gd, php-bcmath — расширения, необходимые phpMyAdmin

Шаг 3: Проверьте, что сервисы работают

Для Debian 13:

systemctl is-active nginx mariadb php8.4-fpm

Для Debian 12:

systemctl is-active nginx mariadb php8.2-fpm

Для Debian 11:

systemctl is-active nginx mariadb php7.4-fpm

Ожидаемый вывод: active для каждого сервиса.


3. 🗄️ Настройка MariaDB

Шаг 1: Запустите скрипт безопасной настройки

sudo mariadb-secure-installation

Что делает: Интерактивный скрипт для повышения безопасности MariaDB.

Рекомендуемые ответы:

  • Switch to unix_socket authenticationY
  • Change the root password?n (оставляем без пароля, т.к. используется unix_socket)
  • Remove anonymous users?Y
  • Disallow root login remotely?Y
  • Remove test database and access to it?Y
  • Reload privilege tables now?Y

Шаг 2: Создайте пользователя для phpMyAdmin

sudo mariadb <<'SQL'
CREATE USER 'pmaadmin'@'localhost' IDENTIFIED BY 'change-this-strong-password';
GRANT ALL PRIVILEGES ON *.* TO 'pmaadmin'@'localhost';
FLUSH PRIVILEGES;
SHOW GRANTS FOR 'pmaadmin'@'localhost';
SQL

Что делает: Создаёт пользователя pmaadmin с паролем (замените change-this-strong-password на свой) и даёт ему полные права на все базы данных.

⚠️ Важно: Не используйте root для входа в phpMyAdmin — на Debian он аутентифицируется через сокет, что не работает через веб-интерфейс.

Проверьте подключение:

mariadb -u pmaadmin -p -e "SELECT VERSION();"

4. 📥 Скачивание и установка phpMyAdmin

Шаг 1: Определите последнюю версию

cd /tmp
curl -fsSL https://www.phpmyadmin.net/home_page/version.txt -o version.txt
VERSION=$(sed -n '1p' version.txt)
BASE_URL="https://files.phpmyadmin.net/phpMyAdmin/${VERSION}"
printf '%s\n' "$VERSION"

Шаг 2: Скачайте архив, подпись и ключ

curl -fL -o "phpMyAdmin-${VERSION}-all-languages.tar.gz" "$BASE_URL/phpMyAdmin-${VERSION}-all-languages.tar.gz"
curl -fL -o "phpMyAdmin-${VERSION}-all-languages.tar.gz.sha256" "$BASE_URL/phpMyAdmin-${VERSION}-all-languages.tar.gz.sha256"
curl -fL -o "phpMyAdmin-${VERSION}-all-languages.tar.gz.asc" "$BASE_URL/phpMyAdmin-${VERSION}-all-languages.tar.gz.asc"
curl -fL -o phpmyadmin.keyring https://files.phpmyadmin.net/phpmyadmin.keyring

Шаг 3: Проверьте подлинность архива

gpg --batch --import phpmyadmin.keyring
sha256sum -c "phpMyAdmin-${VERSION}-all-languages.tar.gz.sha256"
gpg --verify "phpMyAdmin-${VERSION}-all-languages.tar.gz.asc" "phpMyAdmin-${VERSION}-all-languages.tar.gz"

Ожидаемый вывод: OK для контрольной суммы и Good signature для GPG.

Шаг 4: Распакуйте и установите файлы

tar -xzf "phpMyAdmin-${VERSION}-all-languages.tar.gz"
sudo rm -rf /var/www/phpmyadmin
sudo mv "phpMyAdmin-${VERSION}-all-languages" /var/www/phpmyadmin
sudo install -d -o www-data -g www-data -m 0755 /var/lib/phpmyadmin/tmp

Шаг 5: Создайте конфигурационный файл (blowfish_secret)

BLOWFISH_SECRET=$(openssl rand -hex 16)

sudo tee /var/www/phpmyadmin/config.user.inc.php > /dev/null <<EOF
<?php
\$cfg['blowfish_secret'] = '${BLOWFISH_SECRET}';
\$cfg['TempDir'] = '/var/lib/phpmyadmin/tmp';
EOF

Что делает: Создаёт конфигурационный файл с секретным ключом для cookie-аутентификации.

Шаг 6: Проверьте синтаксис конфигурации

php -l /var/www/phpmyadmin/config.user.inc.php

Ожидаемый вывод: No syntax errors detected

Шаг 7: Установите правильные права

sudo chown -R www-data:www-data /var/www/phpmyadmin /var/lib/phpmyadmin
sudo chmod -R u=rwX,go=rX /var/www/phpmyadmin /var/lib/phpmyadmin

5. ⚙️ Настройка Nginx для phpMyAdmin

Шаг 1: Создайте конфигурационный файл

Замените pma.example.com на ваше реальное доменное имя:

Для Debian 13:

sudo tee /etc/nginx/sites-available/phpmyadmin.conf > /dev/null <<'EOF'
server {
    listen 80;
    listen [::]:80;
    server_name pma.example.com;

    root /var/www/phpmyadmin;
    index index.php;

    access_log /var/log/nginx/phpmyadmin_access.log;
    error_log /var/log/nginx/phpmyadmin_error.log;

    location = / {
        return 302 /index.php;
    }

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.4-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}
EOF

Для Debian 12: замените php8.4-fpm.sock на php8.2-fpm.sock
Для Debian 11: замените php8.4-fpm.sock на php7.4-fpm.sock

Шаг 2: Включите сайт

sudo rm -f /etc/nginx/sites-enabled/default
sudo ln -sf /etc/nginx/sites-available/phpmyadmin.conf /etc/nginx/sites-enabled/phpmyadmin.conf
sudo nginx -t
sudo systemctl reload nginx

Шаг 3: Проверьте, что phpMyAdmin доступен

curl -I http://127.0.0.1/index.php

Ожидаемый вывод: HTTP/1.1 200 OK


6. 🔒 Настройка HTTPS с Let’s Encrypt (рекомендуется)

Если ваше доменное имя указывает на сервер, установите SSL-сертификат:

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx --agree-tos --redirect --hsts --staple-ocsp --email you@example.com -d pma.example.com

7. 🔥 Настройка UFW (файрвола, опционально)

Если вы используете UFW, откройте необходимые порты:

sudo ufw allow ssh
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

8. 🔄 Скрипт для обновления phpMyAdmin

Этот скрипт автоматически проверяет последнюю версию phpMyAdmin, скачивает её, проверяет SHA256 и GPG-подпись, заменяет старую директорию и проверяет, что сайт работает после обновления.

Установка скрипта

sudo tee /usr/local/bin/update-phpmyadmin > /dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

app_dir=/var/www/phpmyadmin
state_dir=/var/lib/phpmyadmin
host_header=${PHPMYADMIN_HOST_HEADER:-pma.example.com}
check_url=${PHPMYADMIN_CHECK_URL:-http://127.0.0.1/index.php}

if [ "$(id -u)" -ne 0 ]; then
    printf 'Run this helper with sudo: sudo update-phpmyadmin\n' >&2
    exit 1
fi

if [ ! -f "$app_dir/config.user.inc.php" ]; then
    printf 'Missing %s/config.user.inc.php; install phpMyAdmin first.\n' "$app_dir" >&2
    exit 1
fi

work_dir=$(mktemp -d)
gnupg_home=

cleanup() {
    rm -rf "$work_dir"
    if [ -n "${gnupg_home:-}" ]; then
        rm -rf "$gnupg_home"
    fi
}

restore_previous() {
    printf 'Post-update check failed; restoring the previous phpMyAdmin directory.\n' >&2
    rm -rf "$app_dir"
    mv "$backup_dir" "$app_dir"
}

trap cleanup EXIT

cd "$work_dir"
curl -fsSL https://www.phpmyadmin.net/home_page/version.txt -o version.txt
version=$(sed -n '1p' version.txt)

if [ -z "$version" ]; then
    printf 'Could not read the current phpMyAdmin version.\n' >&2
    exit 1
fi

current_version=unknown
if [ -f "$app_dir/libraries/classes/Version.php" ]; then
    current_version=$(sed -n "s/.*public const VERSION = '\([^']*\)'.*/\1/p" "$app_dir/libraries/classes/Version.php" | head -n 1)
fi
if [ -z "$current_version" ]; then
    current_version=unknown
fi

printf 'Installed version: %s\n' "$current_version"
printf 'Latest version: %s\n' "$version"

if [ "$current_version" = "$version" ]; then
    printf 'phpMyAdmin is already current.\n'
    exit 0
fi

base_url="https://files.phpmyadmin.net/phpMyAdmin/${version}"
curl -fsSLo "phpMyAdmin-${version}-all-languages.tar.gz" "$base_url/phpMyAdmin-${version}-all-languages.tar.gz"
curl -fsSLo "phpMyAdmin-${version}-all-languages.tar.gz.sha256" "$base_url/phpMyAdmin-${version}-all-languages.tar.gz.sha256"
curl -fsSLo "phpMyAdmin-${version}-all-languages.tar.gz.asc" "$base_url/phpMyAdmin-${version}-all-languages.tar.gz.asc"
curl -fsSLo phpmyadmin.keyring https://files.phpmyadmin.net/phpmyadmin.keyring

gnupg_home=$(mktemp -d)
chmod 700 "$gnupg_home"
gpg --homedir "$gnupg_home" --batch --import phpmyadmin.keyring
sha256sum -c "phpMyAdmin-${version}-all-languages.tar.gz.sha256"
gpg --homedir "$gnupg_home" --verify "phpMyAdmin-${version}-all-languages.tar.gz.asc" "phpMyAdmin-${version}-all-languages.tar.gz"
tar -xzf "phpMyAdmin-${version}-all-languages.tar.gz"

test -f "phpMyAdmin-${version}-all-languages/index.php"
test -f "phpMyAdmin-${version}-all-languages/js/vendor/jquery/jquery.min.js"
test -f "phpMyAdmin-${version}-all-languages/themes/pmahomme/css/theme.css"

cp "$app_dir/config.user.inc.php" "$work_dir/config.user.inc.php.backup"
backup_dir="/var/www/phpmyadmin-old-$(date +%Y%m%d%H%M%S)"
mv "$app_dir" "$backup_dir"
mv "phpMyAdmin-${version}-all-languages" "$app_dir"
cp "$work_dir/config.user.inc.php.backup" "$app_dir/config.user.inc.php"

chown -R www-data:www-data "$app_dir" "$state_dir"
chmod -R u=rwX,go=rX "$app_dir" "$state_dir"

if ! curl --noproxy '*' -fsS -D "$work_dir/headers" -o /dev/null -H "Host: ${host_header}" "$check_url"; then
    restore_previous
    exit 1
fi

status_line=$(sed -n '1s/\r$//p' "$work_dir/headers")
case "$status_line" in
*" 200 "* | *" 301 "* | *" 302 "*) ;;
*)
    printf 'Unexpected HTTP status after update: %s\n' "$status_line" >&2
    restore_previous
    exit 1
    ;;
esac

rm -rf "$backup_dir"
printf 'phpMyAdmin updated to %s.\n' "$version"
EOF

sudo chmod 0755 /usr/local/bin/update-phpmyadmin

Запуск обновления

sudo update-phpmyadmin

Ожидаемый вывод (если версия актуальна):

Installed version: 5.2.3
Latest version: 5.2.3
phpMyAdmin is already current.

9. ⚠️ Решение типичных проблем

9.1 Ошибка: 404 Not Found или страница приветствия Nginx

Симптом: Вместо phpMyAdmin открывается стандартная страница Nginx.

Причина: Неправильно настроен виртуальный хост или не отключён сайт по умолчанию.

Решение:

sudo rm -f /etc/nginx/sites-enabled/default
sudo systemctl reload nginx

9.2 Ошибка: 502 Bad Gateway

Симптом: Ошибка 502 при попытке открыть phpMyAdmin.

Причина: PHP-FPM не запущен или указан неверный путь к сокету.

Решение:

Шаг 1: Проверьте статус PHP-FPM (замените версию на вашу):

systemctl is-active php8.4-fpm   # Debian 13

Шаг 2: Если неактивен — запустите:

sudo systemctl enable --now php8.4-fpm

Шаг 3: Проверьте путь к сокету в конфигурации Nginx:

grep fastcgi_pass /etc/nginx/sites-available/phpmyadmin.conf

9.3 Ошибка: Access denied for user ‘root’@’localhost’

Симптом: Не удаётся войти под пользователем root.

Причина: В Debian пользователь root MariaDB аутентифицируется через сокет, что не работает через веб-интерфейс.

Решение: Используйте специально созданного пользователя pmaadmin для входа в phpMyAdmin. Не пытайтесь войти как root.

9.4 Ошибка: Пустая страница (с полным HTML-кодом)

Симптом: Страница полностью белая, но при просмотре исходного кода (Ctrl+U) виден полный HTML phpMyAdmin.

Причина: PHP выполняется, но CSS/JS ресурсы не загружаются. Часто это связано с политикой безопасности Content-Security-Policy (CSP), которая разрешает загрузку только по HTTPS, а сайт открыт по HTTP.

Решение:

Шаг 1: Проверьте, какие заголовки отправляет сервер:

curl -sI http://127.0.0.1/index.php | grep -iE 'content-security|x-frame|strict-transport'

Шаг 2: Если вы видите Content-Security-Policy: default-src https: — переключите сайт на HTTPS (настройте сертификат Let’s Encrypt). Это решит проблему.

9.5 Ошибка: blowfish_secret не задан

Симптом: phpMyAdmin пишет, что не хватает секретного ключа.

Причина: Отсутствует файл config.user.inc.php или в нём нет $cfg['blowfish_secret'].

Решение: Создайте файл заново (см. раздел 4, шаг 5).


10. 🗑️ Удаление phpMyAdmin

sudo rm -rf /var/www/phpmyadmin
sudo rm -rf /var/lib/phpmyadmin
sudo rm -f /etc/nginx/sites-enabled/phpmyadmin.conf
sudo rm -f /etc/nginx/sites-available/phpmyadmin.conf
sudo rm -f /usr/local/bin/update-phpmyadmin
sudo systemctl reload nginx
sudo mariadb -e "DROP USER IF EXISTS 'pmaadmin'@'localhost'; FLUSH PRIVILEGES;"
sudo certbot delete --cert-name pma.example.com   # если создавали сертификат

11. 📝 Чек-лист: что проверить после установки

  • [ ] Nginx работает: systemctl status nginxactive (running)
  • [ ] MariaDB работает: systemctl status mariadbactive (running)
  • [ ] PHP-FPM работает: systemctl status php8.4-fpmactive (running)
  • [ ] phpMyAdmin установлен: ls /var/www/phpmyadmin/index.php → файл существует
  • [ ] Конфигурация Nginx активна: ls /etc/nginx/sites-enabled/phpmyadmin.conf
  • [ ] Страница открывается: curl -I http://127.0.0.1/index.php200 OK
  • [ ] Можно войти: логин pmaadmin и пароль
  • [ ] HTTPS работает (если настроен): https://pma.example.com → зелёный замок
  • [ ] Файрвол настроен: sudo ufw status → порты 80 и 443 открыты
  • [ ] Скрипт обновления установлен: command -v update-phpmyadmin

12. ❓ Часто задаваемые вопросы (FAQ)

Вопрос: Почему вы используете архив upstream, а не пакет phpmyadmin из Debian?
Ответ: Пакет Debian старый (5.2.x против актуального 5.2.x+), имеет другую структуру каталогов и настройки по умолчанию. Upstream-архив даёт последнюю версию и удобную для Nginx структуру.

Вопрос: Какой пользователь и пароль использовать для входа?
Ответ: Используйте pmaadmin и пароль, который вы задали при создании. Никогда не пытайтесь войти как root.

Вопрос: Почему phpMyAdmin такой медленный?
Ответ: Убедитесь, что установлены расширения PHP: php-mbstring, php-xml, php-curl, php-zip, php-gd. Без них phpMyAdmin работает медленнее.

Вопрос: Как ограничить доступ по IP?
Ответ: Добавьте в конфигурацию Nginx внутри блока server:

allow 192.168.1.100;  # замените на ваш IP
deny all;

Вопрос: Как обновить phpMyAdmin до новой версии?
Ответ: Используйте скрипт sudo update-phpmyadmin (создан в разделе 8). Он автоматически проверит, скачает и установит последнюю версию.


13. 🏁 Заключение

Теперь phpMyAdmin установлен и работает с Nginx на вашем Debian. Вы можете управлять базами данных через удобный веб-интерфейс, а скрипт update-phpmyadmin поможет легко обновлять его до новых версий.

Что дальше?

  • Настройте регулярное резервное копирование баз данных
  • Установите Fail2ban для защиты phpMyAdmin от брутфорса
  • Настройте мониторинг сервера