Установка phpMyAdmin на nginx и защита доступа

Своя панель баз данных: установка phpMyAdmin на nginx

Марина
Марина
📅 28 сентября 2026
Своя панель баз данных: установка phpMyAdmin на nginx

Установка phpMyAdmin на сервер с nginx занимает около десяти минут: пакет ставится одной командой apt install phpmyadmin, файлы попадают в каталог /usr/share/phpmyadmin, дальше нужен симлинк в корень сайта и работающий PHP-FPM. Сложность не в установке, а в том, что панель открыта всему интернету по предсказуемому адресу и её перебирают боты. Ниже — последовательность команд и три способа закрыть доступ на любом VPS с nginx.

Материал рассчитан на тех, кто уже арендовал сервер, поставил веб-сервер и базу данных, но ещё не работал с графическими менеджерами баз. Разберём проверку окружения перед установкой, серверный блок nginx, вынос панели на отдельный поддомен, HTTP-авторизацию и белый список IP, лёгкую альтернативу без панели вообще, а также разбор четырёх типовых ошибок — белого экрана, 404, 403 и 502.

Что делает phpMyAdmin и когда он действительно нужен

phpMyAdmin — это веб-интерфейс к серверу баз данных MySQL или MariaDB, написанный на PHP. Вы открываете его в браузере, видите список баз, таблиц и записей, редактируете строки мышкой, выполняете SQL-запросы, делаете дамп базы в файл и загружаете его обратно. То же самое можно сделать из консоли клиентом mysql, но там нет визуального представления таблицы.

Панель полезна в трёх сценариях. Первый — разовая правка данных: поменять пароль администратора в таблице WordPress, удалить тысячу спам-комментариев одним запросом. Второй — перенос: выгрузить дамп в SQL-файл и залить его на другой сервер. Третий — обучение: когда вы только осваиваете SQL, видеть структуру таблиц глазами быстрее, чем набирать DESCRIBE для каждой из них.

Есть и обратная сторона. phpMyAdmin — это PHP-приложение объёмом около 40 МБ, которое постоянно висит на публичном адресе и имеет полный доступ к базе. Поэтому дальше половина статьи посвящена не установке, а тому, как убрать панель с глаз посторонних.

Что должно быть на сервере до установки: PHP 8, nginx и MySQL

phpMyAdmin — не самостоятельная программа, а набор PHP-скриптов. Чтобы они выполнялись, нужны три работающих компонента: веб-сервер nginx, обработчик PHP-FPM версии 8 (программа, которая выполняет PHP-код и возвращает готовую страницу веб-серверу) и сервер баз данных, к которому панель будет подключаться. Если чего-то из этого нет, панель откроется белым экраном или отдаст файл на скачивание вместо страницы.

Проверьте состояние сервисов командой systemctl status: строка active (running) означает, что служба работает, inactive (dead) — что она остановлена.

systemctl status nginx
systemctl status php8.2-fpm
systemctl status mysql

Дальше проверьте версию PHP и расширения. Расширение — это подключаемый модуль интерпретатора PHP; панели их нужно четыре. Модуль mbstring отвечает за кириллицу и другие многобайтовые кодировки, zip — за сжатые дампы, gd — за графики и капчу. Без mysqli панель не подключится к базе.

php -v
php -m | grep -E 'mbstring|zip|gd|mysqli'

Если какого-то модуля в выводе нет, доставьте пакеты и перезапустите обработчик. Перезапуск обязателен: PHP-FPM читает список расширений один раз при старте.

sudo apt install php8.2-mbstring php8.2-zip php8.2-gd php8.2-mysql
sudo systemctl restart php8.2-fpm

Если веб-сервер ещё не установлен, начните с отдельной инструкции по установке nginx на Ubuntu, а потом возвращайтесь к этому шагу.

Как установить phpMyAdmin из репозитория: пошаговая последовательность

Пакет есть в стандартных репозиториях Ubuntu и Debian, поэтому ставится штатным менеджером. Установщик по пути задаст два вопроса в псевдографическом окне — на них легко ответить неправильно, поэтому разберём каждый.

  1. Обновите список пакетов: sudo apt update. Команда скачивает свежие индексы репозиториев, без неё apt может поставить устаревшую сборку.
  2. Запустите установку: sudo apt install phpmyadmin. Вместе с панелью подтянутся зависимости — около 40 МБ файлов.
  3. На экране выбора веб-сервера отметьте ничего. В списке будут только apache2 и lighttpd; nginx там нет, а лишняя галочка приведёт к установке второго веб-сервера, который займёт порт 80/TCP. Пробелом снимите все отметки, затем клавишей Tab перейдите к OK.
  4. На вопрос про dbconfig-common ответьте «Да». Так называется штатный помощник Debian и Ubuntu, который сам создаст служебную базу phpmyadmin и пользователя для неё. Придумайте пароль длиной от 12 символов.
  5. Убедитесь, что файлы на месте: ls /usr/share/phpmyadmin. В выводе должны быть index.php, каталоги libraries и themes.

Отдельно проверьте файл /etc/phpmyadmin/config.inc.php. В нём есть параметр blowfish_secret — строка длиной ровно 32 символа, которой шифруется кука с паролем. Если строка пустая, панель будет ругаться на каждой странице. Впишите туда любые 32 случайных символа.

Проверка окружения перед установкой phpMyAdmin: nginx, PHP-FPM и модули
На экране выбора веб-сервера снимают все галочки: nginx в списке нет, а лишняя отметка поставит второй веб-сервер и займёт 80-й порт.

Подключение панели к nginx: симлинк и отдельный серверный блок

nginx не знает о существовании каталога /usr/share/phpmyadmin — его нужно связать с корнем сайта. Есть два пути. Первый — симлинк (символическая ссылка, ярлык на каталог) внутрь уже существующего сайта. Второй, правильный, — собственный серверный блок с отдельным именем. Начнём с симлинка, потому что он короче.

sudo ln -s /usr/share/phpmyadmin /var/www/example.com/pma

После этой команды панель откроется по адресу вида example.com/pma. Каталог назван pma, а не phpmyadmin — это первая линия обороны. Но у симлинка внутри рабочего сайта есть минус: панель наследует правила основного серверного блока, а ошибка в её настройке ломает сайт. Надёжнее описать отдельный блок — сохраните конфиг ниже в файл /etc/nginx/sites-available/db.example.com.

server {
    listen 80;
    server_name db.example.com;
    root /usr/share/phpmyadmin;
    index index.php;

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

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

Директива root указывает, где лежат файлы; index задаёт стартовый файл; блок location ~ .php$ перенаправляет все PHP-скрипты обработчику через сокет. Путь к сокету должен совпадать с реальным — проверьте его командой ls /run/php/. Активируйте конфиг, проверьте синтаксис и перечитайте настройки.

sudo ln -s /etc/nginx/sites-available/db.example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Почему открытый адрес /phpmyadmin — это дыра в сервере

Как только на IP-адресе появляется живой веб-сервер, к нему начинают стучаться сканеры. Они перебирают список типовых путей: /phpmyadmin, /pma, /mysql, /db, /admin. Это не целенаправленная атака на вас, а массовый обход всего диапазона адресов. Посмотреть масштаб можно прямо в логах веб-сервера.

sudo grep -c -i 'phpmyadmin|/pma' /var/log/nginx/access.log

Команда выводит число строк, где встречается такой путь. На сервере, проработавшем неделю, это обычно сотни запросов; на давнем адресе — тысячи в сутки. Каждый запрос проверяет две вещи: отвечает ли панель и пускает ли она с типовой парой логин-пароль.

Опасность складывается из трёх слагаемых. Панель имеет полный доступ к базе — то есть к паролям пользователей, заказам и персональным данным. Форма входа доступна без ограничений, значит пароль можно подбирать бесконечно. И наконец, в самом phpMyAdmin регулярно находят уязвимости, а обновляют панель владельцы серверов редко. Дальше три способа закрыть панель, от простого к надёжному.

Вынос панели на отдельный поддомен вместо подкаталога

Поддомен — это имя третьего уровня вида db.example.com, которое указывает на тот же сервер. Первый плюс такой схемы: панель перестаёт лежать внутри дерева файлов рабочего сайта, и её конфиг живёт отдельно. Второй: сканеры, которые перебирают пути на основном домене, до неё просто не доходят — они запрашивают example.com/phpmyadmin, а там теперь пусто.

Настройка занимает два шага. В панели управления доменом добавьте A-запись с именем db и IP-адресом сервера, дождитесь обновления DNS — обычно 5–15 минут. Затем в конфиге nginx из предыдущего раздела укажите этот поддомен в server_name и перезагрузите веб-сервер.

Имя лучше выбрать неочевидное. Варианты db, pma и admin тоже есть в словарях сканеров, а вот k7-tools.example.com перебором не найти. Заодно выпишите на поддомен бесплатный сертификат, чтобы пароль от базы не ходил по сети открытым текстом: как это сделать, разобрано в инструкции по установке SSL от Let’s Encrypt.

Оговорка: поддомен сам по себе не защита, а маскировка. Если адрес утечёт в историю браузера или в логи стороннего сервиса, панель снова окажется открытой. Поверх маскировки нужен настоящий замок.

HTTP-авторизация через htpasswd: пароль до загрузки PHP

Базовая HTTP-авторизация — механизм, при котором браузер спрашивает логин и пароль до того, как запрос дойдёт до PHP. Это ключевое отличие от формы входа самого phpMyAdmin: сканер не получает даже страницу, а значит не может ни подобрать пароль от базы, ни использовать уязвимость в коде панели. Сервер отвечает кодом 401 и на этом разговор заканчивается.

Сначала поставьте утилиту htpasswd — она входит в пакет apache2-utils и работает независимо от того, какой у вас веб-сервер. Затем создайте файл с парой логин-пароль. Флаг -c означает «создать новый файл» и нужен только при первом запуске; для добавления второго пользователя его убирают, иначе файл перезапишется.

sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/.pma_htpasswd dbadmin

Утилита дважды спросит пароль (символы при вводе не отображаются — это нормально) и запишет его хеш в файл. Логин берите произвольный, не admin; пароль — от 16 символов и отдельный от пароля к базе. Подключите файл в серверном блоке: две строки внутри server, до всех location.

auth_basic "Restricted area";
auth_basic_user_file /etc/nginx/.pma_htpasswd;

Первая строка задаёт подпись в окне браузера, вторая указывает путь к файлу с паролями. Проверьте конфиг через sudo nginx -t и перезагрузите nginx. При следующем открытии панели браузер покажет системное окно ввода — если оно появилось, защита работает. Дополнительно есть смысл поставить Fail2Ban, который блокирует IP после 5 неудачных попыток за 10 минут.

Ограничение доступа по IP: директивы allow и deny

Самый жёсткий вариант — пускать к панели только с известных адресов. nginx умеет это парой директив: allow перечисляет разрешённые IP, а deny all закрывает всё остальное. Правила читаются сверху вниз, первое совпадение выигрывает, поэтому deny all всегда идёт последним.

allow 203.0.113.25;
allow 198.51.100.0/24;
deny all;

Первая строка разрешает один адрес. Вторая — целую подсеть: запись /24 означает диапазон из 256 адресов, что удобно для офисной сети. Остальные посетители получат ответ 403 и пустую страницу.

Ограничение по IP надёжнее пароля, но у него есть цена. Домашний интернет обычно выдаёт динамический адрес: он меняется после перезагрузки роутера, и наутро вы сами не попадёте в панель. Схема работает, когда у вас статический IP или вы готовы править конфиг при каждой смене адреса. Способы удобно сравнить по таблице — на практике их комбинируют, а не выбирают один.

Способ Что останавливает Настройка Слабое место
Нестандартный путь или поддомен Массовые сканеры по словарю 2 шага, 15 минут Адрес утекает в логи и историю
HTTP-авторизация (auth_basic) Подбор пароля и эксплойты в коде панели 2 команды + 2 строки конфига Слабый пароль короче 12 символов
Белый список IP (allow/deny) Любой запрос с чужого адреса 3 строки конфига Динамический IP: доступ теряете и вы
Только SSH-туннель, панели нет Всё, что приходит из интернета 1 команда при каждом сеансе Нужен локальный клиент базы

Когда панель не нужна вовсе: SSH-туннель и Adminer

Для разовых задач — глянуть таблицу раз в месяц, поправить одну строку — держать постоянно работающую панель невыгодно. Безопаснее не открывать порт наружу, а прокинуть SSH-туннель: соединение шифруется, а MySQL продолжает слушать только локальный интерфейс — адрес 127.0.0.1, доступный лишь с самого сервера. Команда ниже связывает порт 3307 на вашем компьютере с портом 3306 на сервере.

ssh -L 3307:127.0.0.1:3306 user@203.0.113.10 -N

Флаг -L задаёт проброс: локальный порт, затем адрес и порт назначения со стороны сервера. Флаг -N означает «не запускать командную оболочку». После этого в любом настольном клиенте — DBeaver, HeidiSQL, MySQL Workbench — вы подключаетесь к хосту 127.0.0.1 и порту 3307 и попадаете в базу сервера. Закрыли терминал — доступ исчез.

Второй облегчённый вариант — Adminer. Тот же менеджер баз в браузере, но весь код умещается в один PHP-файл размером менее 1 МБ против 40 МБ у phpMyAdmin. Файл кладут в корень сайта под случайным именем и удаляют сразу после работы.

sudo mv ~/adminer.php /var/www/example.com/db-k7f3a2.php
sudo rm /var/www/example.com/db-k7f3a2.php

Первая команда переносит скачанный файл в корень сайта под неугадываемым именем, вторая удаляет его после сеанса. Функций у Adminer меньше, но для правки записей и выгрузки дампа хватает. Если нужен перенос базы целиком, порядок действий описан в разборе про перенос базы данных MySQL.

Коды ответа phpMyAdmin 404, 200, 502, 403 и 401 и первое действие
Код ответа сразу говорит, кто отказал — веб-сервер или PHP, и только 401 здесь штатный: это окно авторизации, а не поломка панели.

Диагностика: белый экран, 404, 403 и 502

Если после установки страница не открывается, разбирайтесь слоями. Первый слой — код ответа: он говорит, кто именно отказал, веб-сервер или PHP. Посмотреть код можно прямо из консоли сервера командой curl -I http://db.example.com — ключ -I запрашивает только заголовки.

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

sudo tail -n 50 /var/log/nginx/error.log

Третий слой — журнал PHP-FPM: sudo journalctl -u php8.2-fpm -n 50. Ключ -n 50 показывает последние 50 строк. Ниже — что означает каждый типовой ответ и с чего начинать.

Что видно Код Обычная причина Первое действие
Страница «Not Found» 404 Симлинк не создан или root указывает не туда ls -l /var/www/example.com/pma
Белый экран без текста 200 Нет блока location ~ .php$ или отсутствует mbstring php -m | grep mbstring
Браузер скачивает файл 200 nginx отдаёт PHP как обычный файл, обработчик не подключён Проверить fastcgi_pass
«Bad Gateway» 502 Неверный путь к сокету PHP-FPM или служба остановлена ls /run/php/
«Forbidden» 403 Сработал deny all, ваш IP не в списке Сверить свой адрес с allow
Окно ввода логина 401 Штатное поведение auth_basic Ввести пару из htpasswd

Сколько ресурсов нужно и на каком сервере это разворачивать

Сама панель нетребовательна: PHP-скрипты работают только в момент запроса. Расход появляется на импорте больших дампов: там всё упирается в лимит памяти PHP. По умолчанию memory_limit равен 128 МБ, upload_max_filesize — 2 МБ, а max_execution_time — 30 секунд: дамп на 200 МБ с такими значениями не загрузится.

Для крупных баз поправьте три параметра в /etc/php/8.2/fpm/php.ini: лимит памяти до 512 МБ, размер загружаемого файла до 256 МБ, время выполнения до 300 секунд. После правки перезапустите PHP-FPM. Если база больше гигабайта, дамп надёжнее заливать из консоли, а панель оставить для просмотра.

По железу минимум такой: 1 ядро, 1 ГБ оперативной памяти и 10 ГБ диска — на этой конфигурации одновременно живут nginx, PHP-FPM, MySQL и панель для небольшого сайта. При посещаемости выше пары тысяч визитов в сутки берите 2 ядра и 2 ГБ памяти. Тарифы собраны в разделе хостинг с поддержкой MySQL и среди недорогих VPS.

Провайдер Стартовая цена Базовая конфигурация Тарифов в каталоге
Cloudcore от 59 ₽/мес 1 ядро, 1 ГБ RAM, 10 ГБ NVMe 12
Hosting-Russia от 99 ₽/мес Стартовый VPS —
4VPS от 110 ₽/мес 1 ядро, 1 ГБ RAM, 5 ГБ NVMe 568
HostVDS от 127 ₽/мес 1 ядро, 1 ГБ RAM, 10 ГБ NVMe 12

Данные проверены 04.09.2026.

Смотрите на диск: 5 ГБ у стартового тарифа 4VPS хватит на систему и небольшую базу, но дампы придётся сразу выкачивать к себе. Под базу от 2 ГБ берите тариф с диском от 20 ГБ.

Частые ошибки при установке и настройке

Большая часть проблем возникает не в момент установки, а через несколько недель — когда про панель забыли, а она продолжает висеть в интернете. Ниже список того, что чаще всего приводит к неприятностям.

  • Оставить панель на пути /phpmyadmin без пароля и белого списка — сканеры находят такой адрес за часы.
  • На экране выбора веб-сервера отметить apache2, хотя стоит nginx: второй веб-сервер займёт порт 80/TCP и уронит сайт.
  • Задать пароль от базы совпадающим с паролем HTTP-авторизации — тогда второй барьер не даёт ничего.
  • Работать с панелью по обычному HTTP: логин и пароль от базы уходят по сети открытым текстом.
  • Прописать deny all с динамического домашнего адреса и потерять доступ к серверу после перезагрузки роутера.
  • Не обновлять пакет месяцами: sudo apt update && sudo apt upgrade стоит запускать хотя бы раз в месяц.

Ещё одна ошибка встречается реже, но обходится дороже: повседневная работа от имени пользователя базы root. Заведите отдельного пользователя с правами только на нужную базу — тогда случайный запрос DROP не снесёт всё остальное.

Частые вопросы

Можно ли поставить phpMyAdmin без установки полноценного веб-сервера? Нет, панель — это PHP-приложение, ей нужен веб-сервер, который принимает запросы, и обработчик PHP-FPM, который выполняет код. Минимальный комплект — nginx плюс PHP 8.2, это около 60 МБ пакетов.

Что делать, если после установки страница белая и в логах пусто? Скорее всего, nginx не передаёт PHP-файлы обработчику. Проверьте, есть ли в конфиге блок location ~ .php$ с директивой fastcgi_pass, и совпадает ли путь к сокету с тем, что выводит ls /run/php/.

Что выбрать — HTTP-авторизацию или ограничение по IP? Если у вас статический адрес, включайте оба: белый список отсекает 100% чужих запросов, а пароль страхует на случай, если адресом завладеет кто-то ещё. При динамическом домашнем интернете оставьте только auth_basic.

Чем Adminer лучше phpMyAdmin? Объёмом и площадью атаки: один файл менее 1 МБ вместо каталога на 40 МБ, его можно удалить сразу после работы. Взамен вы теряете часть инструментов импорта и визуальный дизайнер связей между таблицами.

Насколько безопасно открывать порт 3306 наружу вместо панели? Небезопасно: этот порт перебирают так же активно, как веб-панели. Правильный вариант — оставить MySQL слушать 127.0.0.1 и подключаться через SSH-туннель командой ssh -L 3307:127.0.0.1:3306.

Сколько памяти нужно серверу, если база весит 2 ГБ? Для просмотра и точечных правок хватит 1 ГБ RAM, но для импорта дампа поднимите memory_limit до 512 МБ, а лучше берите тариф с 2 ГБ памяти. Дамп такого размера удобнее заливать из консоли, минуя панель.

Панель просит логин, но база не пускает — где искать причину? Проверьте те же данные из консоли командой mysql -u имя -p. Если и там отказ, дело в правах пользователя базы, а не в phpMyAdmin: выдайте доступ через GRANT и перечитайте привилегии.

Итог

Установка phpMyAdmin сводится к четырём действиям: проверить PHP 8.2 с расширениями mbstring, zip и gd, поставить пакет командой apt install phpmyadmin, связать каталог /usr/share/phpmyadmin с отдельным серверным блоком nginx и закрыть доступ — HTTP-авторизацией, белым списком IP или обоими сразу. Если панель нужна раз в месяц, дешевле и безопаснее обойтись SSH-туннелем к порту 3306 или одним файлом Adminer, который удаляется после работы.

Из железа хватает 1 ядра, 1 ГБ памяти и 10 ГБ NVMe — такие тарифы в каталоге начинаются от 59 ₽/мес, а всего площадок 44. Подобрать площадку под сайт с базой данных можно в подборке VPS для сайтов: там собраны конфигурации с готовым LAMP-окружением и дисками от 10 ГБ.

Поделиться:
👁 26 просмотров
Марина
Редактор · FREEHOSTING
Главный редактор FREEHOSTING. С 2020 года тестирует VDS, VPS и хостинг-провайдеров — арендует серверы, нагружает их реальными проектами и пишет честные обзоры по итогам. Помогает читателям выбирать хостинг под свои задачи: от Telegram-бота до production-сайта.