avatar Ubuntu Установка phpMyAdmin на Nginx в Ubuntu 12.04 / Debian

Управлять сервером баз данных можно из командной строки, но это не всегда удобно, зачатую, хочется большего комфорта.
Если вы в совершенстве знаете синтаксис запросов MySQL, то можно обойтись и без сторонних приложений, лично я, похвастаться этим не могу, по этому предпочитаю работать через WEB интерфейс, одним из лучших, хотя и не единственным, приложением, является phpMyAdmin, как явствует из названия, написанное на PHP.
Данная статья, является, логическим продолжением руководства по настройке WEB сервера, которую я описывал в стетье- Настройка Nginx с поддержкой PHP-FPM в Ubuntu 12.04, все дальнейшие действия будут выполняться на ее основе.

Если у вас установлен Web сервер Apache или Lighttpd, то установка phpMyAdmin сложностей не вызывает, набираем:
apt-get install phpmyadmin

И все установится автоматически.
К сожалению, если у вас используется Nginx, то так сделать все это, в автоматическом режиме, не получится, придется немного поработать руками, но результат получается не хуже, а за счет быстроты работы Nginx, то все совсем здорово «пуляет»…

Сама установка традиционная и не несет никаких сложностей:
apt-get install phpmyadmin


У нас просят -с какими серверами мы будем его использовать, оставляем все поля пустыми:
Установка PhpMyAdmin с Nginx в ubuntu

При инсталляции PhpMyAdmin нам предложат создать базу данных, которая требуется для его работы:
Установка PhpMyAdmin с Nginx в ubuntu

Указываем сначала пароль пользователя Root (Сервера MySQL), а затем пароль для базы данных PhpMyAdmin, на этом, установка данного пакета завершена.

Теперь, нам необходимо, настроить виртуальный хост. Если, для настройки WEB сервера, вы пользовались статьей, ссылка на которую указана в начале, то конфигурационный файл сайта example.org у вас содержит настройки виртуального хоста, нам осталось добавить в него следующее:
nano /etc/nginx/conf.d/example.org.conf


В секцию server{}, нам необходимо добавить следующее:

location /phpmyadmin {
               root /usr/share/;
               index index.php index.html index.htm;
               location ~ ^/phpmyadmin/(.+\.php)$ {
                       try_files $uri =404;
                       root /usr/share/;
                       fastcgi_pass 127.0.0.1:9000;
                       fastcgi_index index.php;
                       fastcgi_param SCRIPT_FILENAME $request_filename;
                       include /etc/nginx/fastcgi_params;
               }
               location ~* ^/phpmyadmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {
                       root /usr/share/;
               }
        }
        location /phpMyAdmin {
               rewrite ^/* /phpmyadmin last;
        }


В результате, у нас должен получиться конфигурационный файл следующего вида:

server {
        listen   80;
        root /home/example/www;

        access_log  /home/example/logs/nginx.access.log; #расположение логов данного хоста

        server_name example.org www.example.org;

        location / {
                index index.php index.html index.htm;
        }

        location ~ \.php$ {
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include        fastcgi_params;
        }
       #Работа с phpMyAdmin
         location /phpmyadmin {
               root /usr/share/;
               index index.php index.html index.htm;
               location ~ ^/phpmyadmin/(.+\.php)$ {
                       try_files $uri =404;
                       root /usr/share/;
                       fastcgi_pass 127.0.0.1:9000;
                       fastcgi_index index.php;
                       fastcgi_param SCRIPT_FILENAME $request_filename;
                       include /etc/nginx/fastcgi_params;
               }
               location ~* ^/phpmyadmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {
                       root /usr/share/;
               }
        }
        location /phpMyAdmin {
               rewrite ^/* /phpmyadmin last;
        }

}


Перезапускаем nginx
/etc/init.d/nginx restart


И идем по адресу httр://example.org/phpmyadmin/
Должны увидеть следующее окно:
phpMyAdmin-login
В принципе можно подключаться и работать.
Но мы на этом не остановимся т.к. зачастую, после подключения сервера к интернет, автоматические сканеры начинают искать phpMyAdmin и если он найден, то запускают процесс перебора паролей, что не очень хорошо…
Мы защитим доступ к данной странице с помощью логина и пароля, в Apache все это делалось через htpasswd, но данный вид файлов не поддерживается Nginx. Ситуация не тупиковая и вполне легко решается.

Добавляем HTTP авторизацию

Для начала, нам необходимо с генерировать хеш пароля, для этого можно установить утилиты, которые идут с сервером Apache и сгенерить все что нам нужно, но мы этого делать не будем, а воспользуемся Online генератором полученный хеш пароля, записываем.
Теперь создадим файл в котором у нас будет все это храниться, чтобы не путаться в дальнейшем, назовем его htpasswd
nano /home/example/htpasswd


Сам файл, мы будем хранить за пределами корневой директории сайта, но чтобы Nginx мог получить к нему доступ, на чтение, для примера, я укажу логин admin и захешированный пароль password, добавим это в файл htpasswd:
admin:ZIXt0E7AewSr2


Теперь нам необходимо добавить в секцию, которая отвечает за работу с директорией phpMyAdmin.
Следующее:
auth_basic "Enter Super Secret password"; 
auth_basic_user_file /home/example/htpasswd;


Где: вместо Enter Super Secret password можно указать текст своего сообщения (кириллица НЕ поддерживается!)
В результате, всех действий, у нас должен получиться файл следующего содержания:

server {
        listen   80;
        root /home/example/www;

        access_log  /home/example/logs/nginx.access.log; #расположение логов данного хоста

        server_name example.org www.example.org;

        location / {
                index index.php index.html index.htm;
        }

        location ~ \.php$ {
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include        fastcgi_params;
        }
           #Работа с phpMyAdmin
         location /phpmyadmin {

              #Секция отвечающая за аутентификацию пользователя

              auth_basic "Enter Super Secret password!"; # Текст сообщения, которое увидит пользователь при попытке входа в указанную директорию
              auth_basic_user_file /home/example/htpasswd;

              root /usr/share/;
               index index.php index.html index.htm;
               location ~ ^/phpmyadmin/(.+\.php)$ {
                       try_files $uri =404;
                       root /usr/share/;
                       fastcgi_pass 127.0.0.1:9000;
                       fastcgi_index index.php;
                       fastcgi_param SCRIPT_FILENAME $request_filename;
                       include /etc/nginx/fastcgi_params;
               }
               location ~* ^/phpmyadmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {
                       root /usr/share/;
               }
        }
        location /phpMyAdmin {
               rewrite ^/* /phpmyadmin last;
        }

}


Перезапускам Nginx:
/etc/init.d/nginx restart


Снова переходим по адресу httр://example.org/phpmyadmin/, выскочит окно с предложением ввода логина и пароля, пишем логин admin пароль password и попадаем в phpMyAdmin

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

42 комментария

avatar
Как настроить «модуль хранения настроек phpMyAdmin»?
avatar
Не очень понятно если честно, хотелось бы от Вас статью получить.
avatar
Статью немного подправил, получилось намного проще…
avatar
Не могли бы вы вернуть статью где было написано как устанавливать через скачивание архива с сайта, создание папок и т.д.?
avatar
Не восстанавливать не буду, иначе придется откатывать бэкапы сайта, да и смысла нет
avatar
Спасибо за мануал, и отдельное за хттп авторизацию, но кое что вы забыли сказать. Неплохо было бы сделать пункт «работа над ошибками», туда поместить самые распространенные ошибки, которые возникают у пользователей. Как пример: я при установке на локальную машину не ставил пароль на рута в mysql, в итоге я не смог авторизоваться в ПМА, т.к. не разрешается вход без пароля ( ошибка #1045) и пошел дальше гуглить, а не остался на вашем сайте. Понятно что кому надо тот найдет, но все же было приятно это знать.
avatar
Это не реально, предугадать все варианты, где пользователь может накосячить…
avatar
Предлагаю взглянуть на хороший и бесплатный инструмент — Valentina Studio 5.x, который вышел буквально пару месяцев назад. Я юзаю уже месяц – до сих пор нахожу новые фишки.
www.valentina-db.com/valentina-studio-overview
avatar
Но это локальное приложение.
Я так понимаю что оно подключается к удаленному серверу баз данных, тогда придется разрешать внешние подключения, что не очень хорошо.
Исключительно вопрос предпочтений.
avatar
Можно конектиться по SSH и тогда не надо открывать внешние подключения.
avatar
Здравствуйте, глубокоуважаемый Artful! Настроил связку Nginx + Apache (отдельно добавил memcached + eaccelerator) согласно Вашей статейке: howitmake.ru/blog/ubuntu/42.html — всё замечательно работает. Но захотелось добавить phpMyAdmin. Установил: aptitude install phpmyadmin. Добавил строчки в /etc/nginx/sites-available/kursk.dyndns.org:

location /phpmyadmin {
               root /usr/share/;
               index index.php index.html index.htm;
               location ~ ^/phpmyadmin/(.+\.php)$ {
                       try_files $uri =404;
                       root /usr/share/;
                       fastcgi_pass 127.0.0.1:9000;
                       fastcgi_index index.php;
                       fastcgi_param SCRIPT_FILENAME $request_filename;
                       include /etc/nginx/fastcgi_params;
               }
               location ~* ^/phpmyadmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ {
                       root /usr/share/;
               }
        }
        location /phpMyAdmin {
               rewrite ^/* /phpmyadmin last;
        }


В итоге, при попытке открыть страничку с phpMyAdmin получаю ошибку от nginx'а: 502 Bad Gateway. В чём моя ошибка? Быть может, метод, описанный в данной статье неприменим к статейке howitmake.ru/blog/ubuntu/42.html?

С уважением, Геннадий.
avatar
Данная ошибка говорит о том что nginx пытается «ломится» к apache, а у вас наверняка, nginx пересылает запросы, скрипты должен лопатить apache, так что необходимость настройки phpmyadmin применительно к nginx, в данной связке, отсутствует.
Установите phpmyadmin на apache, согласно стандартной установки пакета, и будет вам счастье.
avatar
Переустановил phpMyAdmin с выбором Apache2 при установке, добавил в конец файла /etc/apache2/apache2.conf строчку:
Include /etc/phpmyadmin/apache.conf

Теперь phpMyAdmin открывается, но изображения отсутствуют. Получается, phpMyAdmin ведь привязан к Apache2, а статику отдавать должен Nginx. Однако, этого не происходит. В который раз наталкиваюсь на эти грабли с отсутствием изображений, но решения так и не нашёл…

P.S. Есть ли рабочий способ phpMyAdmin привязать именно к Nginx, а не к Apache2? Ведь у меня сейчас именно Nginx статику отдаёт… а с Apache2 счастье, увы, так и не наступило (скорее всего из-за банального недостатка знаний).
avatar
Все правильно, дайте пользователю www-data права на чтение в директорию где лежит phpmyadmin
avatar
Подал команды (чисто ради эксперимента):
chown -R www-data:www-data /usr/share/phpmyadmin/
chmod -R 777 /usr/share/phpmyadmin/

К сожалению, ничего не изменилось. phpMyAdmin открывается, но картинки не грузит.

P.S. Не знаю, насколько это важно, но при запуске\перезапуске Apache2 пишется:

The Alias directive in /etc/phpmyadmin/apache.conf at line 3 will probably never match because it overlaps an earlier Alias.
avatar
картинки не грузятся потому что у nginx нет прав на чтение содержимого директории -99%
после обновления прав, nginx перезагружали?!
avatar
Да, конечно перезагружал. И nginx, и apache2. Быть может логи прольют свет:

apache_error.log:
[Sun May 19 17:52:44 2013] [error] [client 192.168.0.26] phpmyadmin: Failed to load /etc/phpmyadmin/config-db.php. Check group www-data has read access., referer: http://kursk.dyndns.org/phpmyadmin/navigation.php?target=main.php&token=0cff5d5f0cf76de72caa235a8afbeb79
[Sun May 19 17:52:44 2013] [error] [client 192.168.0.26] phpmyadmin: Failed to load /etc/phpmyadmin/config-db.php. Check group www-data has read access., referer: http://kursk.dyndns.org/phpmyadmin/index.php?token=0cff5d5f0cf76de72caa235a8afbeb79&old_usr=root
[Sun May 19 17:52:45 2013] [error] [client 192.168.0.26] phpmyadmin: Failed to load /etc/phpmyadmin/config-db.php. Check group www-data has read access., referer: http://kursk.dyndns.org/phpmyadmin/index.php?token=0cff5d5f0cf76de72caa235a8afbeb79&old_usr=root
[Sun May 19 17:52:45 2013] [error] [client 192.168.0.26] phpmyadmin: Failed to load /etc/phpmyadmin/config-db.php. Check group www-data has read access., referer: http://kursk.dyndns.org/phpmyadmin/index.php?token=0cff5d5f0cf76de72caa235a8afbeb79&old_usr=root


nginx_error.log
2013/05/19 17:52:44 [error] 5845#0: *1 open() "/home/kursk.dyndns.org/www/phpmyadmin/favicon.ico" failed (2: No such file or directory), client: 192.168.0.26, server: kursk.dyndns.org, request: "GET /phpmyadmin/favicon.ico HTTP/1.1", host: "kursk.dyndns.org", referrer: "http://kursk.dyndns.org/phpmyadmin/index.php?token=0cff5d5f0cf76de72caa235a8afbeb79&old_usr=root"
2013/05/19 17:52:44 [error] 5845#0: *6 open() "/home/kursk.dyndns.org/www/phpmyadmin/print.css" failed (2: No such file or directory), client: 192.168.0.26, server: kursk.dyndns.org, request: "GET /phpmyadmin/print.css HTTP/1.1", host: "kursk.dyndns.org", referrer: "http://kursk.dyndns.org/phpmyadmin/index.php?token=0cff5d5f0cf76de72caa235a8afbeb79&old_usr=root"
2013/05/19 17:52:44 [error] 5845#0: *7 open() "/home/kursk.dyndns.org/www/phpmyadmin/themes/pmahomme/jquery/jquery-ui-1.8.custom.css" failed (2: No such file or directory), client: 192.168.0.26, server: kursk.dyndns.org, request: "GET /phpmyadmin/themes/pmahomme/jquery/jquery-ui-1.8.custom.css HTTP/1.1", host: "kursk.dyndns.org", referrer: "http://kursk.dyndns.org/phpmyadmin/index.php?token=0cff5d5f0cf76de72caa235a8afbeb79&old_usr=root"
2013/05/19 17:52:44 [error] 5845#0: *6 open() "/home/kursk.dyndns.org/www/phpmyadmin/themes/pmahomme/img/logo_right.png" failed (2: No such file or directory), client: 192.168.0.26, server: kursk.dyndns.org, request: "GET /phpmyadmin/themes/pmahomme/img/logo_right.png HTTP/1.1", host: "kursk.dyndns.org", referrer: "http://kursk.dyndns.org/phpmyadmin/index.php?token=0cff5d5f0cf76de72caa235a8afbeb79&old_usr=root"
2013/05/19 17:52:44 [error] 5845#0: *7 open() "/home/kursk.dyndns.org/www/phpmyadmin/themes/pmahomme/img/b_help.png" failed (2: No such file or directory), client: 192.168.0.26, server: kursk.dyndns.org, request: "GET /phpmyadmin/themes/pmahomme/img/b_help.png HTTP/1.1", host: "kursk.dyndns.org", referrer: "http://kursk.dyndns.org/phpmyadmin/index.php?token=0cff5d5f0cf76de72caa235a8afbeb79&old_usr=root"
2013/05/19 17:52:45 [error] 5845#0: *5 open() "/home/kursk.dyndns.org/www/phpmyadmin/themes/pmahomme/img/input_bg.gif" failed (2: No such file or directory), client: 192.168.0.26, server: kursk.dyndns.org, request: "GET /phpmyadmin/themes/pmahomme/img/input_bg.gif HTTP/1.1", host: "kursk.dyndns.org", referrer: "http://kursk.dyndns.org/phpmyadmin/index.php?token=0cff5d5f0cf76de72caa235a8afbeb79&old_usr=root"
avatar
Разумеется, phpMyAdmin находится в /usr/share/phpmyadmin, а не в /home/kursk.dyndns.org/www/phpmyadmin, как ошибочно олагает nginx.
avatar
Выложите конфиг nginx полностью
avatar
Извольте:

user www-data;
worker_processes  4; # Обычно устанавливается по количеству ядер в процессоре

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
    # multi_accept on;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    server_names_hash_bucket_size 64;
    access_log  /var/log/nginx/access.log;
    server_tokens off;

    proxy_buffers 8 16k;
    proxy_buffer_size 32k;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay        on;


    gzip                on; #Использование сжатия статики (Пример: CSS)
    gzip_proxied        any;
    gzip_min_length     1100;
    gzip_http_version   1.0;
    gzip_buffers        4 8k;
    gzip_comp_level     4; #Степень сжатия (больше ставить смысла нет, нагрузка на ЦПУ растет, а файлы меньше не практически становятся)
    gzip_types          text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;


    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}


Все конфиги делались на основе Вашей статейки (https://howitmake.ru/blog/ubuntu/42.html).
avatar
А это файл /etc/nginx/sites-available/kursk.dyndns.org:

server {
listen 80;
server_name kursk.dyndns.org kursk.dyndns.org;
access_log /home/kursk.dyndns.org/log/nginx_access.log;
error_log /home/kursk.dyndns.org/log/nginx_error.log;
location ~* \.(jpg|jpeg|gif|png|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|swf|ico|flv|txt|docx|xlsx)$ {
root /home/kursk.dyndns.org/www/;
index index.htm index.html index.php;
access_log off;
expires 30d;
}
location ~ /\.ht {
deny all;
}

location / {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $remote_addr;
proxy_set_header Host $host;
proxy_connect_timeout 60;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_redirect off;
proxy_set_header Connection close;
proxy_pass_header Content-Type;
proxy_pass_header Content-Disposition;
proxy_pass_header Content-Length;
}
}
avatar
Вот тут посмотрите forum.ubuntu.ru/index.php?topic=88544.0 на вид, работающее решение, но сам не проверял, т.к. от связки Nginx+Apache отказался в сторону nginx+php-fpm
avatar
Тему эту видел давно. Пробовал применить рекомендации оттуда. К сожалению, не помогло — костяк phpMyAdmin открывается (формы ввода логина\пароля, таблицы и прочее), но без изображений. Однако, если разместить phpMyAdmin в /home/kursk.dyndns.org/www/phpmyadmin, то всё открывается нормально, с изображениями. Но хотелось бы обойтись без этого.

Связка nginx+php-fpm работает шустрее и стабильнее, чем Nginx+Apache? Просто привык, что у Apache можно использовать фишку .htaccess\.htpasswd в каждой директории, а Nginx таких удобств не предоставляет…
avatar
Nginx работает намного быстрее, раньше данный сайт работал на связке nginx+apache потом от индейца отказался, раньше страница генерировалась за 0,1 сек, теперь, в среднем за 0,03 сек, так что разница на лицо.
htpass прикручивается в легкую, о чем, в статье, выше написано.
avatar
Во втором конфиге nano /etc/nginx/conf.d/example.org.conf где-то косяк, не стал разбираться. Если вставить первый спойлер в конфиг из статьи, что указана в начале, то все заработает. Похоже где-то ошибка.
avatar
Похоже кто-то, что-то написал не подумав, не стал разбираться… Похоже где-то ошибка…
avatar
Не работает второй конфиг, нгинкс не стартует. Первый работает, если его в ставить в конфиг из статью на которую дана ссылка вначале.
avatar
Как бы вот:
server_name mail.example.org;

server_name example.org www.example.org;

Просто с нгинксом не имел дела, просто копипастил и на баг время потратил, решил отписать.
avatar
И в чем там ошибка? В адресе виртуального хоста?!
avatar
Кеп как бы намекает. Просто для новичков должно все быть рабочим. Мне пофиг, статью поправьте и все.
Снова переходим по адресу httр://example.org/phpmyadmin/, выскочит окно с предложением ввода логина и пароля, пишем логин admin пароль password и попадаем в phpMyAdmin
avatar
Вот это другой разговор.
Спасибо за уточнение, статью поправил…
avatar
А так, дякую!
avatar
Зравья!
Есть Debian 7 с nginx, mysql, php, phpmyadmin…
Также есть сайт на Djoomla и дамп его базы данных в формате example_mysql.sql
Вопрос, как правильно подключить эту базу данных через mysql-client или phpmyadmin?
avatar
Доброго дня
Через mysql client все делается легко и не принужденно:
mysql -u username -p DBNAME < SQL_db_dump.sql
enter password:

где:
username — имя пользователя для подключения к базе
DBNAME — имя базы
SQL_db_dump.sql — путь к файлу дампа базы-данных

Через phpmyadmin тоже все делается несложно, в Nginx нужно разрешить закачивать файлы большого объема, а также в PHP увеличить лимит на закачку файлов, поуполчанию там, кажется, 3 Мб
avatar
Спасибо, большие файлы пока не надо.
Нужно ли создавать нового пользователя в mysql для импортируемой БД?
Какие права ему дать и как лучше это сделать?
В интернетах пишут что нужно создать пользователя с именем импортируемой БД,
и назначить ему права, верно ли это?
avatar
Самое простое создать пользователя и одноименную базу и предоставить ему полные права на эту базу, посмотрите phpmyadmin, там это делается в разделе Привилегии, с заполнением 4х полей и одной галки.
avatar
Спасибо, помогло!
Есть что добавить? Регистрируйся и оставляй комментарии!