Поиск по сайту:

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


Введение

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

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

Установите MySQL на сервер базы данных

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

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

Начните с обновления кеша пакетов и установки сервера MySQL:

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

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

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

sudo mysql_install_db

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

sudo mysql_secure_installation

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

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

Настройте MySQL для разрешения удаленного доступа

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

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

sudo nano /etc/mysql/my.cnf

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

[mysqld]

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

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

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

bind-address        = your_database_IP

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

Чтобы заставить MySQL прочитать новое изменение, которое мы только что внедрили, мы можем перезапустить базу данных:

sudo service mysql restart

Настройка удаленных учетных данных и базы данных WordPress

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

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

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

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

Начните с подключения к MySQL, используя учетную запись root и пароль администратора, который вы настроили:

mysql -u root -p

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

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

CREATE DATABASE wordpress;

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

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

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

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

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

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

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

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

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

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

Для справки, команда, которую мы будем использовать для блокировки учетной записи (не волнуйтесь, мы дадим вам эту команду снова, когда она вам понадобится):

GRANT SELECT,DELETE,INSERT,UPDATE ON wordpress.* TO 'wordpressuser'@'web_server_ip';

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

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

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

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

FLUSH PRIVILEGES;

Теперь вы можете выйти из командной строки MySQL, набрав:

exit

Проверка удаленных и локальных подключений

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

Во-первых, проверьте соединение с вашей машины базы данных, попытавшись войти в систему с нашей новой учетной записью:

mysql -u wordpressuser -p

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

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

exit

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

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

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

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

mysql -u wordpressuser -h database_server_IP -p

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

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

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

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

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

mysql -u wordpressuser -h database_server_IP -p

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

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

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

Настройте веб-сервер

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

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

sudo apt-get install nginx php5-fpm php5-mysql

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

Настроить PHP

Давайте начнем с PHP, так как это довольно просто.

Откройте файл конфигурации PHP для php-fpm, который будет обрабатывать наш динамический контент. Нам просто нужно изменить одно значение в этом:

sudo nano /etc/php5/fpm/php.ini

Найдите параметр cgi.fix_pathinfo. Вероятно, он будет закомментирован символом \;” символ и установите значение \1. Нам нужно отменить оба этих условия, раскомментировав строку и установив для нее значение «0»:

cgi.fix_pathinfo=0

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

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

Затем нам нужно открыть еще один файл, чтобы изменить способ взаимодействия нашего PHP-процессора и веб-сервера:

sudo nano /etc/php5/fpm/pool.d/www.conf

Найдите директиву listen, для которой должно быть задано значение 127.0.0.1:9000. Вместо того, чтобы использовать порт, мы установим его на сокет домена unix:

listen = /var/run/php5-fpm.sock

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

Теперь, когда у нас есть наши значения, перезапустите наш PHP-процессор:

sudo service php5-fpm restart

Настроить Nginx

Теперь мы готовы настроить Nginx. Мы можем начать с копирования файла виртуального хоста по умолчанию в новый файл, с которым мы можем работать. Мы назовем это в честь домена нашего сайта. Я собираюсь использовать заполнитель \example.com:

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com

Теперь откройте файл, который мы только что скопировали:

sudo nano /etc/nginx/sites-available/example.com

Внутри мы изменим наш блок сервера (разделы, заключенные в скобки server). Начните с раскомментирования директивы для прослушивания порта 80. Мы также собираемся изменить корневой каталог и заставить Nginx обслуживать индексный файл PHP по умолчанию:

server {
    listen 80;
    root /var/www/example.com;
    index index.php index.hmtl index.htm;

Затем мы изменим директиву server_name, чтобы использовать наше доменное имя, убедиться, что наш try_files настроен правильно (передача запросов в PHP, если файлы не найдены) и что наши страницы ошибок настроены:

server {
    listen 80;
    root /var/www/example.com;
    index index.php index.hmtl index.htm;
    server_name example.com;
    location / {
        try_files $uri $uri/ /index.php?q=$uri&$args;
    }
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/www;
    }

Наконец, нам нужно настроить фактическую обработку PHP, используя блок местоположения, который будет соответствовать всем нашим запросам PHP. Мы немедленно вернем 404, если точное совпадение не будет найдено. Мы также будем использовать сокет, который мы настроили для PHP:

server {
    listen 80;
    root /var/www/example.com;
    index index.php index.hmtl index.htm;
    server_name example.com;
    location / {
        try_files $uri $uri/ /index.php?q=$uri&$args;
    }
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/www;
    }
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

Это конец нашей конфигурации блока сервера. Сохраните и закройте файл.

Теперь мы связываем это с нашим каталогом «enabled» и удаляем ссылку на файл блока сервера по умолчанию:

sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

Перезапустите Nginx, чтобы эти изменения вступили в силу:

sudo service nginx restart

Установить WordPress

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

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

cd ~
wget http://wordpress.org/latest.tar.gz

Извлеките файлы, которые создадут каталог с именем \wordpress в вашем домашнем каталоге:

tar xzvf latest.tar.gz

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

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

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

/** 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', 'database_server_ip');

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

Далее нам нужно создать структуру каталогов, которую мы настроили в конфигурации блока нашего сервера Nginx. Если вы помните, я использую «example.com» для своей демонстрации, но вы должны использовать все, что вы указали в своей конфигурации Nginx:

sudo mkdir -p /var/www/example.com

Затем мы скопируем файлы и каталоги, найденные в нашем каталоге ~/wordpress, в новый корень документа, который мы только что создали:

sudo cp -r ~/wordpress/* /var/www/example.com

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

cd /var/www/example.com

Мы собираемся передать все файлы в этом каталоге нашему пользователю веб-сервера, который называется www-data:

sudo chown -R www-data:www-data *

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

sudo usermod -a -G www-data your_user
sudo chmod -R g+rw /var/www/example.com

Настройка сайта через веб-интерфейс

Теперь все, что вам нужно сделать, это завершить установку через веб-интерфейс.

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

http://example.com

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

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

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

Ограничить разрешения удаленной базы данных

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

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

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

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

mysql -u root -p

Введите пароль, чтобы получить доступ к подсказке.

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

show grants for 'wordpressuser'@'web_server_IP';
+---------------------------------------------------------------------------------------------------------------------------+
| Grants for wordpressuser@xx.xxx.xxx.xxx                                                                                   |
+---------------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wordpressuser'@'xx.xxx.xxx.xxx' IDENTIFIED BY PASSWORD '*5FD2B7524254B7F81B32873B1EA6D681503A5CA9' |
| GRANT ALL PRIVILEGES ON `wordpress`.* TO 'wordpressuser'@'xx.xxx.xxx.xxx'                                                 |
+---------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

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

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

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

REVOKE ALL PRIVILEGES on wordpress.* FROM 'wordpressuser'@'web_server_IP';

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

show grants for 'wordpressuser'@'web_server_IP';
+---------------------------------------------------------------------------------------------------------------------------+
| Grants for wordpressuser@10.128.213.175                                                                                   |
+---------------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wordpressuser'@'xx.xxx.xxx.xxx' IDENTIFIED BY PASSWORD '*5FD2B7524254B7F81B32873B1EA6D681503A5CA9' |
+---------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Теперь мы можем добавить привилегии, которые мы хотели бы вернуть учетной записи. Нам нужны привилегии UPDATE, INSERT, SELECT и DELETE для повседневного использования:

GRANT SELECT,DELETE,INSERT,UPDATE ON wordpress.* TO 'wordpressuser'@'web_server_ip';

Если мы проверим еще раз, мы увидим, что наши детализированные привилегии теперь установлены.

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

FLUSH PRIVILEGES;

После этого снова выйдите из MySQL:

exit

Заключение

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