Масштабируемый Wordpress-кластер почти бесплатно

Создать свой кластер для работы любимой CMS довольно просто. И, кстати, очень дешево.

Кластер для WordPress

Как директор по разработке Design Home, одной из ведущих мобильных игр Glu Mobile, я имею дело с действительно большими вопросами масштабируемости. Поэтому, когда я решил настроить свой собственный блог Effective Programmer, используя WordPress, для меня было естественным создать что-то, что можно масштабировать для работы с сотнями тысяч пользователей в сутки.

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

Архитектура

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

Докеризированный кластер Wordpress

WordPress и кластер

Самый первый шаг – создать Docker образ для моего сайта на основе базового образа Wordpress. В нем заменить локальный каталог wp-content на тот, что содержит нужные плагины и темы. Это важно, потому что без докерного решения будет очень сложно и трудоемко запускать один и тот же образ Wordpress на каждом инстансе в кластере. Вот как я делаю мой докер на основе официального базового образа Wordpress.

FROM wordpress:5.1.1
RUN rm -rf /var/www/html/wp-content
COPY ./wp-content /var/www/html/wp-content

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

Среда разработки

Я использовал Docker Compose для своей локальной среды разработки - он добавляет локальный экземпляр MySQL. Таким образом, я могу создать и протестировать свой сайт локально, прежде чем кластер получит рабочие инстансы AWS. Вот как выглядит мой файл Docker:

version: '3'
services:
  wp:
    image: naveed125/effective-programmer:latest
    restart: always
    ports:
    - "8080:80"
    volumes:
    - ./wp-content:/var/www/html/wp-content
    links:
    - db
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_PASSWORD: p4ssw0rd!
      WORDPRESS_CONFIG_EXTRA: define('AS3CF_SETTINGS', '...');
  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: dbp4ss!
    volumes:
    - ./data/mysql:/var/lib/mysql

Рабочий сервер (кластер)

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

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

Рабочая база данных

В кластерной среде все экземпляры Wordpress должны подключаться к одной и той же базе данных. Поэтому решение на основе docker-compose не будет работать. Я начал с бесплатного экземпляра MySQL в RDS, который можно масштабировать для использования больших экземпляров в зависимости от нагрузки.

Централизованная загрузка файлов

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

Чтобы решить эту проблему, я использовал бесплатный плагин WP Offload Media Light для направления загрузок на S3 и использовал настройки для удаления загруженных файлов из контейнера. Этот плагин автоматически заменяет URL-адреса файлов на URL-адреса S3 и имеет отличную документацию по безопасной настройке. Он также поддерживает CDN, поэтому в будущем я планирую поставить CloudFront перед моей корзиной S3 для улучшения загрузки.

Настройка домена

Я зарегистрировал свой домен у GoDaddy и направил его на Elastic Load Balancer в EC2. Он, в свою очередь, указывает на мой экземпляр (или экземпляры) Wordpress.

Поддержка SSL

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

Обновления и улучшения

Улучшения и обновления тем, плагинов и самого Wordpress просты сами по себе. Сначала устанавливаете и тестируете обновление локально. Потом создаете и отправляете образ и обновляете контейнеры в кластере.

Безопасность и мониторинг

Безопасность - большая проблема для Wordpress-сайтов. Уже через несколько секунд после запуска я получил массу спама в комментариях. В то же время я хотел найти достойное решение для отслеживания статистики моего сайта. Случайно оказалось, что Jetpack от команды Wordpress фантастически решает обе эти проблемы. В итоге я отключил комментарии, чтобы не платить за akismet. Да, я действительно хотел максимально сэкономить в этом проекте :)

Заключение

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

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

Ура!

Источник

Еще про облака и кластеры:

МЕРОПРИЯТИЯ

Комментарии

ВАКАНСИИ

Добавить вакансию
Golang разработчик (middle)
от 230000 RUB до 300000 RUB
DevOps
Санкт-Петербург, от 150000 RUB до 400000 RUB
Аналитик данных
Екатеринбург, по итогам собеседования

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ