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

Вступление

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

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

Предпосылки

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

  • Два сервера Ubuntu 18.04. У каждого должен быть пользователь без полномочий root с привилегиями sudo и включенным брандмауэром UFW, как описано в нашем руководствеInitial Server Setup with Ubuntu 18.04. На одном из этих серверов будет размещаться ваш бэкэнд MySQL, и в этом руководстве мы будем называть егоdatabase server. Другой будет удаленно подключаться к вашему серверу базы данных и действовать как ваш веб-сервер; аналогично, в этом руководстве мы будем называть егоweb server.

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

  • MySQL установленon your database server. Следуйте заHow To Install MySQL on Ubuntu 18.04, чтобы настроить это.

  • Необязательно (но настоятельно рекомендуется) сертификаты TLS / SSL от Let’s Encrypt устанавливаютon your web server. Вам нужно будет приобрести доменное имя и иметьDNS records set up for your server, но сами сертификаты бесплатны. Наш гидHow To Secure Nginx with Let’s Encrypt on Ubuntu 18.04 покажет вам, как получить эти сертификаты.

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

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

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

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

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

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

. . .
[mysqld]
. . .

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

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

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

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

[mysqld]
. . .
bind-address = db_server_ip

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

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

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

Сохраните и закройте файл, когда вы закончите. Если вы используетеnano, сделайте это, нажавCTRL+X,Y, а затемENTER.

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

sudo mysql_ssl_rsa_setup --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

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

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

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

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

sudo mysql

[.Примечание]##

Note: Если у вас включена аутентификация по паролю, как описано вStep 3 of the prerequisite MySQL tutorial, вместо этого вам нужно будет использовать следующую команду для доступа к оболочке MySQL:

mysql -u root -p

После выполнения этой команды вас попросят ввести пароль MySQLroot, а после его ввода вам будет предложено новое приглашениеmysql>.

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

CREATE DATABASE wordpress;

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

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

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

Затем предоставьте этой учетной записи полный доступ к базе данныхwordpress:

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

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

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

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

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

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

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

FLUSH PRIVILEGES;

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

exit

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

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

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

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

mysql -u wpuser -p

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

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

exit

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

ssh sammy@web_server_ip

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

sudo apt update

Затем установите клиентские утилиты MySQL:

sudo apt install mysql-client

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

mysql -u remotewpuser -h db_server_ip -p

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

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

status

Если соединение действительно использует SSL, в строкеSSL: будет указано это, как показано здесь:

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
--------------

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

exit

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

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

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

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

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

[[step-4 -—- install-wordpress]] == Шаг 4 - Установка 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',         '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

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

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

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

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

/wordpress/wp-config.php

. . .
/** 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:

/wordpress/wp-config.php

define('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL);

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

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

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

После этого остается только изменить владельца файла. Измените владельца всех файлов в корневом каталоге документа наwww-data, пользователя веб-сервера Ubuntu по умолчанию:

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

После этого WordPress установлен, и вы готовы выполнить его процедуру настройки через Интернет.

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

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

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

http://example.com

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

WordPress install screen

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

Заключение

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

Related