Настройка удаленной базы данных MySQL для оптимизации производительности сайта в Ubuntu 18.04

По мере роста сайта или приложения трафик будет увеличиваться и, вероятно, исходных ресурсов станет не хватать. Если веб-сервер и база данных обслуживаются одним сервером, вы сможете увеличить производительность, переместив БД на отдельный сервер.

Данный мануал поможет настроить удаленную БД MySQL и подключить к ней ваше приложение. Для примера здесь используется WordPress, но эта технология подойдет и для других приложений с MySQL на бэкэнде.

Требования

  • Два сервера Ubuntu 18.04 (сервер 1 и сервер 2), настроенные согласно этому мануалу.
  • Сервер 1 будет обслуживать веб-сервер. Установите на него стек LEMP (инструкции найдете здесь, раздел по установке MySQL нужно пропустить).
  • На втором сервере нужна установка MySQL (читайте мануал Установка MySQL в Ubuntu 18.04).
  • Опционально: защитите стек LEMP SSL-сертификатом. Чтобы создать сертификат Let’s Encrypt, вам понадобится домен.

1: Настройка MySQL для поддержки удаленных соединений

Переместив обработку БД на отдельный сервер, вы увеличите производительность сайта. Кроме того, так вы получите базовую структуру для настройки балансировки нагрузки. Установив MySQL по мануалу, который мы предложили в Требованиях, вы должны немного изменить конфигурацию, чтобы включить поддержку удаленных соединений.

Большинство параметров сервера MySQL можно изменить в файле mysqld.cnf, который по умолчанию хранится в каталоге /etc/mysql/mysql.conf.d/. Откройте этот файл на сервере 2 с правами root в редакторе. Здесь мы будем использовать nano:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Этот файл состоит из разделов, заголовки которых берутся в квадратные скобки. Найдите раздел mysqld:

. . .
[mysqld]
. . .

В нем найдите параметр bind-address, который определяет, какие сетевые адреса нужно прослушивать.

На данный момент MySQL привязан к 127.0.0.1, то есть прослушивает только локальные соединения. Это нужно изменить, указав внешний IP-адрес, по которому можно получить доступ к серверу.

Если оба сервера находятся в центре обработки данных с поддержкой частной сети, используйте внутренний IP-адрес сервера 2. В противном случае вы можете использовать внешний IP-адрес:

[mysqld]
. . .
bind-address = db_server_ip

Чтобы подключаться к базе данных через Интернет, нужно зашифровать подключения и так обеспечить безопасность данных. Если вы не зашифруете соединение с MySQL, любой пользователь в сети сможет перехватить конфиденциальные данные между веб-сервером и сервером базы данных. Добавьте следующую строку после bind-address:

[mysqld]
. . .
require_secure_transport = on
. . .

Сохраните и закройте файл.

Для обеспечения SSL-соединений нужно создать ключ и сертификат. MySQL предлагает команду, которая автоматически установит все необходимое. Запустите следующую команду, которая создаст необходимые файлы. Также сделает их доступными для чтения сервером MySQL, указав UID пользователя mysql:

sudo mysql_ssl_rsa_setup --uid=mysql

Чтобы обновить конфигурацию MySQL, перезапустите базу данных:

sudo systemctl restart mysql

Чтобы убедиться, что сервер прослушивает удаленные соединения, используйте netstat:

sudo netstat -plunt | grep mysqld
tcp        0      0 db_server_ip:3306     0.0.0.0:*               LISTEN      27328/mysqld

Эта команда выведет сетевую статистику сервера. Как видите, процесс mysqld привязан к адресу db_server_ip по стандартному порту MySQL 3306.

Откройте этот порт в брандмауэре:

sudo ufw allow mysql

2: Настройка БД для WordPress и создание учетных данных

MySQL теперь прослушивает внешний IP-адрес, но в настоящее время в СУБД нет пользователей или базы данных с удаленной поддержкой. Создайте базу данных для WordPress и пользователя, который сможет получить к ней доступ.

Подключитесь к MySQL как root:

sudo mysql

Примечание: Если вы настроили парольную аутентификацию, для доступа к оболочке MySQL вам нужно будет ввести эту команду

mysql -u root -p

После выполнения этой команды вам будет предложено ввести root пароль MySQL, а затем вы получите доступ к командной строке mysql>.

В командной строке MySQL создайте базу данных, которую будет использовать WordPress. Лучше выбрать этой базе данных узнаваемое имя, чтобы позже вы могли легко ее найти. Здесь мы назовем ее просто wordpress.

CREATE DATABASE wordpress;

Теперь, когда есть база данных, нужно создать пользователя. При этом нужно определить два разных профиля на основе того, откуда он подключается. Создайте локального пользователя, а удаленный пользователь будет привязан к IP-адресу веб-сервера.

Чтобы создать локального пользователя wpuser, укажите localhost в команде:

CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'password';

Передайте этому пользователю все права на БД.

GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';

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

Теперь создайте сопутствующую учетную запись, которая будет поддерживать удаленные соединения исключительно с веб-сервера (сервер 1). Для этого понадобится IP-адрес вашего веб-сервера. Чтобы настройка была последовательной и понятной, можно использовать то же имя пользователя, что и раньше, только указать другой хост.

Имейте в виду, что IP-адрес должен использовать ту же сеть, что указана в файле mysqld.cnf. Это означает, что если вы ранее указали внутренний IP-адрес, вам нужно создать правило для использования внутреннего IP-адреса веб-сервера. Если вы настроили сервер MySQL для использования внешнего IP-адреса, вы должны указать внешний IP-адрес веб-сервера.

CREATE USER 'remotewpuser'@'web_server_ip' IDENTIFIED BY 'password';

Теперь у вас есть пользователь для удаленного доступа к БД. Передайте ему права на БД:

GRANT ALL PRIVILEGES ON wordpress.* TO 'remotewpuser'@'web_server_ip';

Затем нужно сбросить привилегии, чтобы обновить настройки:

FLUSH PRIVILEGES;

Закройте командную строку MySQL:

exit

3: Тестирование удаленных и локальных подключений

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

Сначала проверьте локальное соединение с сервером 2:

mysql -u wpuser -p

Введите пароль пользователя. Если вы видите на экране командную строку MySQL, соединение было успешно создано. Закройте командную строку:

exit

Теперь перейдите на сервер 1.

ssh 8host@web_server_ip

Для начала установите клиентские инструменты MySQL, чтобы получить доступ к удаленной БД. Обновите индекс пакетов и установите все необходимое:

sudo apt update
sudo apt install mysql-client

Подключитесь к серверу 2:

mysql -u remotewpuser -h db_server_ip -p

Помните о том, что IP-адреса должны находиться в одной сети. Если вы используете внутренний адрес на сервере MySQL, используйте такой же адрес на сервере 1.

Будет запрошен пароль remotewpuser. Если соединение было успешно создано, вы увидите командную строку MySQL. Убедитесь, что соединение использует SSL:

status
--------------
mysql  Ver 14.14 Distrib 5.7.18, for Linux (x86_64) using  EditLine wrapper
Connection id:      52
Current database:
Current user:       remotewpuser@203.0.113.111
SSL:         Cipher in use is DHE-RSA-AES256-SHA
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.7.18-0ubuntu0.16.04.1 (Ubuntu)
Protocol version:   10
Connection:     203.0.113.111 via TCP/IP
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
TCP port:       3306
Uptime:         3 hours 43 min 40 sec
Threads: 1  Questions: 1858  Slow queries: 0  Opens: 276  Flush tables: 1  Open tables: 184  Queries per second avg: 0.138
--------------

Строка SSL: говорит о том, что соединение использует шифрование SSL. Закройте командную строку.

exit

Для дополнительной проверки вы можете попробовать сделать то же самое с третьего сервера, чтобы убедиться, что этому другому серверу не будет предоставлен доступ. Так вы сможете подтвердить, что удаленные соединения ограничены одним удаленным сервером.

Перейдите на сервер 3, у которого нет доступа к БД.

Примечание: Возможно, вам понадобится установить утилиты, как на сервер 1.

Введите:

mysql -u wordpressuser -h db_server_ip -p

Команда должна выдать ошибку:

ERROR 1130 (HY000): Host '203.0.113.12' is not allowed to connect to this MySQL server

4: Установка WordPress

Чтобы проверить возможности новой удаленной БД MySQL, установите на сервер 1 WordPress – популярную платформу для размещения сайтов и блогов. Для этого нужно загрузить ПО, настроить подключение и запустить установку WordPress в браузере.

Перейдите на сервер 1 и загрузите последний релиз WordPress в домашний каталог:

cd
curl -O https://wordpress.org/latest.tar.gz

Распакуйте архив, после чего в домашнем каталоге появится каталог wordpress:

tar xzvf latest.tar.gz

WordPress содержит пример файла конфигурации, который можно использовать в качестве шаблона. Создайте копию этого файла, удалив -sample из имени файла, после чего WordPress будет его читать:

cp ~/wordpress/wp-config-sample.php ~/wordpress/wp-config.php

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

Чтобы WordPress сгенерировал случайные ключи, введите:

curl -s https://api.wordpress.org/secret-key/1.1/salt/

В терминале появятся ключи, которые нужно скопировать и вставить в файл wp-config.php.

Внимание! Не копируйте приведенные ниже ключи! Используйте свои уникальные значения.

define('AUTH_KEY',         'L4|2Yh(giOtMLHg3#] DO NOT COPY THESE VALUES %G00o|te^5YG@)');
define('SECURE_AUTH_KEY',  'DCs-k+MwB90/-E(=!/ DO NOT COPY THESE VALUES +WBzDq:7U[#Wn9');
define('LOGGED_IN_KEY',    '*0kP!|VS.K=;#fPMlO DO NOT COPY THESE VALUES +&[%8xF*,18c @');
define('NONCE_KEY',        'fmFPF?UJi&(j-{8=$- DO NOT COPY THESE VALUES CCZ?Q+_~1ZU~;G');
define('AUTH_SALT',        '@qA7f}2utTEFNdnbEa DO NOT COPY THESE VALUES t}Vw+8=K%20s=a');
define('SECURE_AUTH_SALT', '%BW6s+d:7K?-`C%zw4 DO NOT COPY THESE VALUES 70U}PO1ejW+7|8');
define('LOGGED_IN_SALT',   '-l>F:-dbcWof%4kKmj DO NOT COPY THESE VALUES 8Ypslin3~d|wLD');
define('NONCE_SALT',       '4J(<`4&&F (WiK9K#] DO NOT COPY THESE VALUES ^ZikS`es#Fo:V6');

Скопируйте ключи и откройте конфигурационный файл:

nano ~/wordpress/wp-config.php

Найдите раздел, который содержит фиктивные значения этих параметров:

. . .
define('AUTH_KEY',         'put your unique phrase here');
define('SECURE_AUTH_KEY',  'put your unique phrase here');
define('LOGGED_IN_KEY',    'put your unique phrase here');
define('NONCE_KEY',        'put your unique phrase here');
define('AUTH_SALT',        'put your unique phrase here');
define('SECURE_AUTH_SALT', 'put your unique phrase here');
define('LOGGED_IN_SALT',   'put your unique phrase here');
define('NONCE_SALT',       'put your unique phrase here');
. . .

Удалите эти строки и вставьте значения, скопированные из командной строки.

Затем нужно ввести информацию о соединении с удаленной базой данных. Эти строки находятся в верхней части файла, чуть выше, перед ключами.

. . .
/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');
/** MySQL database username */
define('DB_USER', 'remotewpuser');
/** MySQL database password */
define('DB_PASSWORD', 'password');
/** MySQL hostname */
define('DB_HOST', 'db_server_ip');
. . .

Следующая строка настроит WordPress для поддержки SSL при соединении с MySQL. Добавьте ее в любую точку файла.

define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

Скопируйте файлы и каталоги из ~/wordpress в корневой каталог Nginx. Флаг –а сохранит все права файлов.

sudo cp -a ~/wordpress/* /var/www/html

Теперь все файлы на месте. Остается только изменить права собственности на них. Передайте права на корневой каталог пользователю веб-сервера, www-data:

sudo chown -R www-data:www-data /var/www/html

5: Установка WordPress в браузере

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

Откройте в браузере:

http://example.com

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

Welcome!
Welcome to the famous five-minute WordPress installation process! …

Введите необходимую информацию. После этого нужно будет войти в интерфейс администратора WordPress с помощью только что созданной учетной записи. Затем вы попадете в панель инструментов, где сможете настроить свой сайт и управлять им.

Заключение

Теперь у вас есть защищенная шифрованием БД MySQL, которая принимает SSL-соединения от удаленной установки WordPress. Команды и методы, используемые в этом мануале, подойдут для настройки практически любого веб-приложения, написанного на любом языке программирования, однако некоторые детали реализации будут отличаться. Обратитесь к документации вашего приложения или базы данных за дополнительной информацией.

Tags: , ,