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

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

Кластер для WordPress

Архитектура

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

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

WordPress и кластер

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

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

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

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

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

Как только я стал доволен локальной установкой, следующий шаг — запустить ее в продакшн. Я начал с одного бесплатного экземпляра 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!

Ура!

Источник

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

proglib.io

Добавить комментарий

Ваш e-mail не будет опубликован.

3 + 5 =