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

Вступление

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

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

Предпосылки

Перед началом этого урока вам понадобится:

  • Два сервера Ubuntu 16.04 с пользователем без полномочий root с поддержкой sudo и включенным брандмауэром UFW, как описано вInitial Server Setup with Ubuntu 16.04.

  • На одном из серверов вам понадобится установленный стек LEMP (Linux, Nginx, MySQL, PHP). Наш учебникHow To Install Linux, Nginx, MySQL, PHP (LEMP stack) in Ubuntu 16.04 проведет вас через этот процесс. Вам следует пропустить шаг 2, посвященный установке MySQL. Вместо этого мы установим MySQL в этом руководстве.

  • По желанию (но настоятельно рекомендуется) вы можете защитить свой веб-сервер LEMP с помощью SSL-сертификатов. Вам понадобится доменное имя, но сертификаты бесплатны. Наш гидHow To Secure Nginx with Let’s Encrypt on Ubuntu 16.04 покажет вам, как это сделать.

[[step-1 -—- install-mysql-on-the-database-server]] == Шаг 1 - Установка MySQL на сервере базы данных

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

Для начала мы установим MySQL на сервер, на которомdid not установим стек LEMP. Войдите на этот сервер, затем обновите кэш пакета и установите программное обеспечение сервера MySQL:

sudo apt-get update
sudo apt-get install mysql-server

Вам будет предложено установить и подтвердить парольroot для MySQL во время процедуры установки. Выберите надежный пароль и запишите его, так как он понадобится нам позже.

MySQL должен быть установлен и запущен сейчас. Давайте проверим с помощьюsystemctl:

systemctl status mysql
Output● mysql.service - MySQL Community Server
   Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2017-05-23 14:54:04 UTC; 12s ago
 Main PID: 27179 (mysqld)
   CGroup: /system.slice/mysql.service
           └─27179 /usr/sbin/mysqld

СтрокаActive: active (running) означает, что MySQL установлен и работает. Теперь мы сделаем установку немного более безопасной. MySQL поставляется со скриптом, который проведет вас через блокировку системы:

mysql_secure_installation

Вам будет предложено ввести пароль MySQLroot, который мы только что установили. Введите его и нажмитеENTER. Теперь мы ответим на ряд запросов «да» или «нет». Давайте пройдемся по ним:

Сначала нас спрашивают оvalidate password plugin, плагине, который может автоматически обеспечивать соблюдение определенных правил надежности паролей для ваших пользователей MySQL. Включение этого решения - это решение, которое вам необходимо принять исходя из ваших индивидуальных потребностей в области безопасности. Введитеy иENTER, чтобы включить его, или просто нажмитеENTER, чтобы пропустить его. Если этот параметр включен, вам также будет предложено выбрать уровень 0–2 для строгой проверки пароля. Выберите число и нажмитеENTER, чтобы продолжить.

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

На остальные запросы можно ответитьyes. Вам будет предложено удалить пользователя MySQLanonymous, запретить удаленный вход в системуroot, удалить базу данныхtest и перезагрузить таблицы привилегий, чтобы предыдущие изменения вступили в силу должным образом. Это все хорошая идея. Введитеy и нажмитеENTER для каждого.

Сценарий завершится после того, как будут получены ответы на все запросы. Теперь наша установка MySQL достаточно защищена. На следующем шаге мы настроим MySQL для разрешения доступа с удаленных подключений.

[[step-2 -—- configuring-mysql-to-listen-for-remote-connections]] == Шаг 2. Настройка MySQL для прослушивания удаленных подключений

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

Откройте файл конфигурацииmysqld с правами root в редакторе:

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

Этот файл разделен на разделы, обозначенные словами в скобках ([и]). Найдите раздел с надписьюmysqld:

mysqld.cnf

. . .
[mysqld]

В этом разделе вам нужно будет найти параметр под названиемbind-address. Это сообщает программному обеспечению базы данных, на каком сетевом адресе прослушивать соединения.

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

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

/etc/mysql/my.cnf

[mysqld]
. . .
bind-address = db_server_ip

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

/etc/mysql/my.cnf

. . .
require_secure_transport = on

Сохраните и закройте файл, когда вы закончите.

Чтобы SSL-соединения работали, нам нужно создать несколько ключей и сертификатов. MySQL поставляется с командой, которая автоматически устанавливает все, что нам нужно:

sudo mysql_ssl_rsa_setup --uid=mysql

Это создаст необходимые файлы и сделает их доступными для чтения сервером MySQL (--uid=mysql).

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

sudo systemctl restart mysql

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

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

netstat выводит статистику о сетевой системе нашего сервера. Этот вывод показывает нам, что процесс с именемmysqld присоединен кdb_server_ip в порту3306, стандартном порте MySQL.

Теперь откройте этот порт на брандмауэре, чтобы пропустить трафик:

sudo ufw allow mysql

Затем мы настроим пользователей и базу данных, которые нам понадобятся для удаленного доступа к серверу.

[[step-3 -—- setting-up-a-wordpress-database-and-remote-credentials]] == Шаг 3 - Настройка базы данных WordPress и удаленных учетных данных

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

Начните с подключения к MySQL, используя учетную запись MySQLroot:

mysql -u root -p

Вам будет предложено ввести пароль MySQLroot, а затем вам будет предложено новое приглашениеmysql>.

Теперь мы можем создать базу данных, которую будет использовать WordPress. Мы просто назовем этоwordpress, чтобы потом легко его идентифицировать:

CREATE DATABASE wordpress;

[.note] #Note: Все операторы SQL должны заканчиваться точкой с запятой (;). Если вы нажметеENTER в команде MySQL и увидите только новую строку с приглашением->, вы, вероятно, забыли точку с запятой. Просто введите его в новую строку и снова нажмитеENTER, чтобы продолжить.
#

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

Сначала мы создаем нашего локального пользователяwordpressuser и заставляем эту учетную запись соответствовать только попыткам локального подключения, используяlocalhost в объявлении:

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

Давайте продолжим и предоставим этой учетной записи полный доступ к нашей базе данных:

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

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

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

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

CREATE USER 'wordpressuser'@'web-server_ip' IDENTIFIED BY 'password';

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

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

Сбросьте привилегии, чтобы записать их на диск и начать их использовать:

FLUSH PRIVILEGES;

Затем выйдите из командной строки MySQL, набрав:

exit

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

[[step-4 -—- testing-remote-and-local-connections]] == Шаг 4. Тестирование удаленных и локальных подключений

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

Сначала проверьте локальное соединение с вашегоdatabase machine, попытавшись войти в систему с нашей новой учетной записью:

mysql -u wordpressuser -p

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

Если вы получили приглашение MySQL, то локальное соединение прошло успешно. Вы можете выйти снова, набрав:

exit

Войдите в свойweb server, чтобы проверить удаленные соединения.

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

sudo apt-get update
sudo apt-get install mysql-client

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

mysql -u wordpressuser -h db_server_ip -p

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

Вам будет предложено ввести пароль для вашей учетной записиwordpressuser, и, если все пойдет хорошо, вам будет предложено приглашение MySQL. Мы можем проверить, что соединение использует SSL с помощью следующей команды:

status
Output--------------
mysql  Ver 14.14 Distrib 5.7.18, for Linux (x86_64) using  EditLine wrapper

Connection id:      52
Current database:
Current user:       [email protected]
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

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

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

mysql -u wordpressuser -h db_server_ip -p

Это не должно завершиться успешно. Он должен выдать ошибку, которая выглядит примерно так:

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

Это то, что мы ожидаем и чего хотим.

Мы успешно протестировали наше удаленное соединение и теперь можем приступить к установке WordPress.

[[step-5 -—- install-wordpress]] == Шаг 5 - Установка WordPress

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

На вашемweb server загрузите последнюю версию 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.

[.warning] #Warning! Важно каждый раз запрашивать уникальные значения. Do not скопируйте значения, показанные ниже!
#

Outputdefine('AUTH_KEY',         '1jl/vqfs

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

nano ~/wordpress/wp-config.php

Найдите раздел, содержащий фиктивные значения для этих настроек. Это будет выглядеть примерно так:

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');
. . .

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

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

wp-config.php

. . .
/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');

/** MySQL database username */
define('DB_USER', 'wordpressuser');

/** MySQL database password */
define('DB_PASSWORD', 'password');

/** MySQL hostname */
define('DB_HOST', 'db_server_ip');
. . .

И, наконец, в любом месте файла вставьте следующую строку, которая говорит WordPress использовать SSL-соединение с нашей базой данных MySQL:

wp-config.php

define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

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

Затем нам нужно скопировать файлы и каталоги из каталога~/wordpress в корень документа Nginx. Мы используем флаг-a, чтобы убедиться, что наши разрешения сохранены:

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

Теперь все наши файлы на месте. Осталось только изменить владельца файла. Мы собираемся сделать так, чтобы все файлы в корне документа принадлежали нашему пользователю веб-сервераwww-data:

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

Теперь WordPress должен быть установлен и готов к работе через процедуру настройки через Интернет. Мы сделаем это на следующем этапе.

[[step-6 -—- setting-up-wordpress-through-the-web-interface]] == Шаг 6 - Настройка Wordpress через веб-интерфейс

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

Перейдите к доменному имени (или общедоступному IP-адресу), связанному с вашим веб-сервером:

http://example.com

Вы увидите экран выбора языка для установщика WordPress. Выберите подходящий язык и перейдите на главный экран установки:

WordPress install screen

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

Заключение

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

Related