Лучшие решения по высоконагруженным сайтам: WordPress, способный выдержать бесконечно много трафика

Это информация о том, как настроить множество серверов под один сайт на WordPress.

Введение

Нам необходимо решить как минимум две задачи:

  1. Использовать горизонтальное масштабирование, чтоб пропускная способность возрастала кратно используемым серверам
  2. Отсутствие уязвимых мест, которые могут привести к потере данных

По этому самым логичным и эффективным решением будет создание одного главного сервера и множества дочерних.

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

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

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

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

Настройка репликации базы

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

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

О том, как сконфигурировать mysql для репликации хорошо написано в официальной документации: http://dev.mysql.com/doc/refman/5.6/en/replication.html

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

На сервере с mysql master нужно приостановить запись в базу. Для этого нужно запустить консоль mysql с полными root правами и выполнить команды:

FLUSH TABLES WITH READ LOCK;
SET GLOBAL read_only = ON;
EXIT

После этого можно спокойно сделать дамп базы. После чего опять зайти в консоль mysql и выполнить эти команды:

SHOW MASTER STATUS;
SET GLOBAL read_only = OFF;
UNLOCK TABLES;

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

Дамп базы нужно влить на mysql slave, после чего зайти в консоль mysql с полными root правами и выполнить команды:

CHANGE MASTER TO
MASTER_HOST='XXX',
MASTER_USER='YYY',
MASTER_PASSWORD='ZZZ',
MASTER_LOG_FILE='LLL',
MASTER_LOG_POS=NNN;
START SLAVE;
SHOW SLAVE STATUS\G
EXIT

Где XXX — это адрес mysql master, YYY — пользователь для репликации и ZZZ — соответственно его пароль. Значения LLL и NNN были выданы предыдущей командой.

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

Ну и наконец создаем пользователя для локальной реплики с правами только на чтение.

Настройка работы WordPress на дочернем сервере

Для работы с несколькими базами мы будем использовать https://codex.wordpress.org/HyperDB

Его настройка очень проста — файл с конфигом db-config.php размещается в корне сайта, а db.php в директории wp-content.

Кроме того, нам понадобится модифицировать сам конфиг WordPress wp-config.php, чтоб прописать адрес сайта, который может отличатся от указанного на главном сервере.

Соотвественно эти три файла мы исключим из синхронизации

Настройка синхронизации файлов на дочернем сервере

Каждый раз, когда дочерний сервере перезагружается, то нужно заново синхронизировать файлы с основным. Для этого нужно прописать в /etc/rc.local такую команду:

rsync -az --delete -e ssh --exclude
wp-config.php --exclude db-config.php --exclude wp-content/db.php
master:/path/to/wp /local/path/to/

Настройка синхронизации файлов на основном сервере

Для синхронзации изменений в файлах будем использовать lsyncd. Для этого создадим конфиг /etc/lsyncd/lsyncd.conf.lua с таким содержимым:

settings{
logfile = "/var/log/lsyncd.log",
statusFile = "/var/log/lsyncd-status.log",
nodaemon = false
}
sync{
default.rsyncssh,
delete = true,
source="path/to/wp",
host="slave",
targetdir="/local/path/to/wp",
exclude={
"wp-config.php",
"db-config.php",
"wp-content/db.php"
},
rsync = {
archive = true,
perms = true,
owner = true,
_extra = {"-a"},
},
delay = 10,
maxProcesses = 2,
ssh = {
port = 22
}
}

Теперь можно запускать lsyncd. Настройка закончена.

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