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 authentication→YChange the root password?→n(оставляем без пароля, т.к. используется unix_socket)Remove anonymous users?→YDisallow root login remotely?→YRemove test database and access to it?→YReload 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 nginx→active (running) - [ ] MariaDB работает:
systemctl status mariadb→active (running) - [ ] PHP-FPM работает:
systemctl status php8.4-fpm→active (running) - [ ] phpMyAdmin установлен:
ls /var/www/phpmyadmin/index.php→ файл существует - [ ] Конфигурация Nginx активна:
ls /etc/nginx/sites-enabled/→phpmyadmin.conf - [ ] Страница открывается:
curl -I http://127.0.0.1/index.php→200 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 от брутфорса
- Настройте мониторинг сервера