Debian.pro/

Про Debian


Большой мануал: часть 12. Ставим и немного настраиваем mysql-сервер (или Percona Server), создаём базы данных.

Эта статья — часть Большого Мануала по настройке lamp-сервера на debian.

Предыдущая часть цикла — Немного безопасности и паранойи на вашем сервере дешевым способом. Snoopy.

Следующая часть цикла — Получаем ssl-сертификат. Letsencrypt в массы.

Сегодня мы будем ставить mysql-сервер и немного настраивать его. Ну и заодно на сдачу создадим базы данных для нашего сайта.
Если вы читали часть 3 мануала, то у вас подключены репозитории percona.
Какая разница между перконовским и обычным mysql? С вашей точки зрения — никакой. Базы создаются и там, и там, php умеет работать и с тем, и с другим. Есть устоявшееся мнение, что перконовский движок InnoDB (XtraDB) работает быстрее нативного InnoDB. +у перконы есть пачка хороших утилит, которые они тестируют со своим сервером. Ну а вообще меня покорило то, что у них mysql5.6 собирали под всякое древнее гавно. При этом при сборке они включали голову и 5.6 действительно работал на том же debian lenny, а отличии от…

Если подключены репозитории — будем ставить перконовский сервер:

root@server:~# apt-get install percona-server-server-5.5

Или percona mysql server 5.6:

root@server:~# apt-get install percona-server-server-5.6

Если перкону не желаете, то ставьте обычный mysql-сервер:

root@server:~# apt-get install mysql-server-5.5

Или версии 5.6, если доступен:

root@server:~# apt-get install mysql-server-5.6

При установке у нас спросят для root-пользователя внутри mysql. Учтите, что «этот root» не имеет ничего общего с обычным системным рутом (просто называется так же). Пароль лучше сделать другим. Пароль нужно запомнить (чуть позже мы его запишем так, чтобы можно было не запоминать, но при этом его никто не мог спереть).
Пароль спросят 2 раза, чтобы вы не опечатались.

Теперь запустим скрипт mysql_secure_installation — он запустит настройку базовых рекомендаций о безопасности mysql-сервера (окей, на самом деле он просто удали гранты, которых не должно быть на продакшне), чтобы нам не пришлось делать их руками:

root@server:~# mysql_secure_installation

Важные вопросы:

Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y

На эти вопросы нужно ответить Y, на остальные — по вкусу. После этого советую проверить анонимный доступ к базам — https://debian.pro/1252.
Если вы установили mysql-server 5.6+ (неважно в чьей редакции), да и вообще установили mysql, следует проверить параметр performance_schema. Он должен быть выставлен в off — это сильно экономит потребление памяти мускулем. Если вам performance_schema нужен — то включите, измерьте, потом выключайте. А для всех остальных случаев в конфиг /etc/mysql/my.cnf в секцию [mysqld] добавьте

performance_schema=off

Так же я советую вам проверить значение параметра bind-address — лучше его выставлять в 127.0.0.1 (само собой, в том случае, если вы не планируете того, чтобы в мускуль ходили снаружи). Вообще-то из коробки так и должно быть.
Все остальные параметры в дефолтном конфиге для debian достаточно неплохи для большинства случаев и их можно использовать до тех пор, пока у вас не тонны памяти и нагрузка не станет измеряться хотя бы десятком запросов в секунду на сайт.
В оптимизации настроек mysql вам всегда поможет скрипт mysqltuner.pl — его нужно скачать, запустить — в ответ он сообщит вам рекомендации о том, какие крутилки в конфиге нужно покрутить. Важно только запускать его спустя несколько суток после последнего рестарта mysql-сервера. Где-то в следующих статьях я напишу про конфиг mysql для битрикса, в остальных случаях используйте дефолт + рекомендации от скрипта mysqltuner.

Теперь нам нужно создать файл /root/.my.cnf, в котором мы укажем пароль от мускульного рута. С этого момента этот пароль нам можно будет забыть.
Что ещё важно — любой запуск mysql/mysqldump от рута (системного рута в данном случае имеется в виду) будет читать этот конфиг и пароль не нужно будет сохранять где-либо в других скриптах (проще заботиться о безопасности одного конфига).
Создаём файл /root/.my.cnf со следующим содержимым:

[mysql]
user = root
password = your_mysql_root_pass

[mysqldump]
user = root
password = your_mysql_root_pass

И выставляем на него корректные права:

root@server:~# chown root:root /root/.my.cnf; chmod 600 /root/.my.cnf

Всё, теперь команды mysql/mysqldump пароля не требует.

Ну и ещё вам пригодится скрипт сброса рутового пароля mysql.
Осталось научиться создавать базы и пользователей, которые будут использоваться нашими сайтами.
Стоит поговорить о схеме доступов в mysql в целом. Во-первых, никогда не подключайтесь мускульным рутом из кода вашего сайта к mysql (если вы где-то засветите этот пароль, например, на странице ошибки — получат доступ ко всем базам).
Есть базы, есть пользователи. У каждого пользователя есть какие-либо права доступа внутри mysql — к одной базе, к нескольким. Или у него вообще нет прав доступа к базам, они могут только подключиться к mysql. Или у пользователя есть доступ к одной единственной таблице.
Я вам советую придерживаться схемы 1 пользователь = 1 база = 1 сайт.

У mysql-сервера есть отдельная консоль. Перейдем в неё:

root@server:~# mysql

Создаём базу:

mysql> create database `example_com`;
Query OK, 1 row affected (0.00 sec)

Добавляем пользователя:

mysql> CREATE USER 'example_user'@'localhost' IDENTIFIED BY 'very_secret_password';
Query OK, 0 rows affected (0.00 sec)

Выдаём ему права на доступ к базе:

mysql> GRANT ALL ON `example_com`.* to 'example_user'@'localhost';
Query OK, 0 rows affected (0.00 sec)

Повторить для каждого сайта по вкусу.
Вроде всё. Mysql готов.

09.08.2015 byinkvizitor68sl|big-manual

Комментарии (6):

  1. yukra :

    Я бы на твоем месте (все таки цикл для новичков) упомянул бы что пользователь это «имя пользователя» + адрес машины. То есть user@localhost и user@192.168.1.% это 2 разных пользователя, они могут иметь разные пароли, разные гранты и тп. И что в данном случае «192.168.1.%» читается как «192.168.1.*»

  2. Да, попробую написать. Но пока по плану даже не успеваю =(

  3. e-kinst :

    С файлом /root/.my.cnf получилась небольшая лажа — в таком виде он не работает(по крайней мере для MySQL 5.5.49, который в Jessie). Должно быть так:
    [client]
    user=имя-пользователя
    password=пароль-пользователя

    А вообще серия супер — не знаю, что бы я делал без нее, когда понадобилось поднимать VDS. Спасибо!

  4. Мда, про user забыл. Вообще он должен цеплять его автоматом из whoami, но полно ситуаций, когда этого не происходит.

  5. mrz :

    зачем debian-sys-maint пользователь?
    в 5.6 конфиги в conf.d и они пустые

  6. > зачем debian-sys-maint пользователь?
    Чтобы дебиановские init скрипты могли свои грязные делишки внутри мускуля делать (как минимум — check database после старта мускуля).

    > в 5.6 конфиги в conf.d и они пустые
    В 5.6 в дебиане всё тот же /etc/my.cnf, который инклудит /etc/mysql/conf.d (или что-то такое, лень идти смотреть). И да, conf.d в такой схеме по дефолту содержит ничего.

Написать комментарий