Как создать отказоустойчивый сайт на WordPress, используя возможности CLO
В этой статье мы рассмотрим пример построения отказоустойчивого сайта на WordPress, использующего возможности балансировщика нагрузки и серверов проекта CLO с предустановленной ОС.
Технические требования
Для развёртывания сайта в соответствии с указанным примером вам потребуются:
- сервер CLO с ОС Debian 12, любым количеством vCPU и объёмом RAM
- внешний IP-адрес, подключенный к серверу (для удобства настройки)
- домен с созданной DNS-записью, указывающей на сервер
- кластер MySQL 8 без внешнего IP-адреса
- включенный виртуальный роутер NAT
В данной статье в качестве примера используются следующие имена:
- сервер — wp-node-1
- домен — example.ru
Вы можете заменить эти имена на актуальные названия вашего сервера и домена.
Установка программного обеспечения
Установите набор необходимых пакетов:
apt install -y gnupg nginx php-fpm php-mysqli php-gd certbot python3-certbot-nginx ocfs2-tools
Используя certbot, выпустите сертификат lets encrypt для вашего домена:
certbot certonly -d example.ru
Удалите стандартную конфигурацию nginx:
rm -f /etc/nginx/sites-enabled/default
Создайте новый файл конфигурации nginx (/etc/nginx/sites-enabled/example.ru) со следующим содержимым:
server {
listen 80 default_server;
listen 443 ssl default_server;
ssl_certificate /etc/letsencrypt/live/example.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.ru/privkey.pem;
root /var/www/example.ru;
index index.php;
server_name _;
location / {
try_files $uri $uri/ index.php$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
}
Загрузите и распакуйте WordPress:
wget https://ru.wordpress.org/latest-ru_RU.tar.gz
tar -zxf latest-ru_RU.tar.gz
rm -rf /var/www/html
mv wordpress /var/www/example.ru
chown -R www-data:www-data /var/www/example.ru
Перезагрузите nginx, чтобы новая конфигурация вступила в силу:
nginx -s reload
Откройте в браузере сайт https://example.ru/ и выполните установку WordPress, используя интерфейс установщика. На втором шаге установки используйте параметры доступа к кластеру MySQL, заданные при создании этого кластера.
Перенос существующего сайта на новый сервер
Если у вас уже есть готовый сайт, вам необходимо выполнить следующие действия:
- перенести данные из старой СУБД в новую
- перенести статические файлы сайта на новый сервер
- отредактировать файл wp-config.php для корректного подключения WordPress к новой СУБД
Копирование сервера и настройка балансировщика
Отключите сервер и сделайте снапшот.
Используя снапшот, создайте копию сервера без внешнего IP-адреса. В нашем примере копия будет называться wp-node-2.
После создания копии сервера снапшот можно удалить.
Для обеспечения отказоустойчивости сайта нужно использовать балансировщик нагрузки, на который будет указывать домен. Перенесите внешний IP-адрес сервера wp-node-1 на балансировщик, выполнив следующие действия:
- отключите внешний IP от сервера wp-node-1
- создайте балансировщик в Личном кабинете, используя ранее отключенный IP-адрес
- в качестве бэкенд-серверов укажите wp-node-1 и wp-node-2 с портами 80:80 и 443:443
- запустите серверы wp-node-1 и wp-node-2
После запуска серверов сайт example.ru будет доступен, пока работает хотя бы один сервер. Балансировщик нагрузки будет работать, используя локальные IP-адреса этих серверов. При этом сертификат SSL уже размещен на серверах.
Обновление отказоустойчивого сайта
Приведённая выше схема работы сайта требует от администратора сайта более внимательного подхода к процессам установки обновлений и любым иным действиям связанным с изменением кода сайта.
Для установки обновлений необходимо придерживаться следующей схемы действий:
- отключить от балансировщика все серверы, кроме одного
- выполнить процесс обновления для не отключенного сервера
- сделать снапшот обновлённого сервера
- создавать новые серверы в необходимом количестве, используя снапшот
- подключить заново созданные серверы к балансировщику нагрузки
Существуют и другие способы решения этой задачи. Например, можно копировать каталог /var/www/example.ru с обновлённого сервера на не обновлённые для синхронизации содержимого.
Необходимо также решить вопрос регулярного обновления SSL-сертификатов. Можно использовать долгосрочные сертификаты которые нужно обновлять один раз в год. Кроме того, требуется организовать эффективное резервное копирование.