Автоматизация развертывания масштабируемого сайта WordPress

Вступление

В этом руководстве мы создадим и развернем масштабируемый экземпляр WordPress, состоящий из сервера базы данных MySQL, распределенной файловой системы GlusterFS, веб-серверов Nginx и балансировщика нагрузки Nginx. Используя user-data и https://www.digitalocean.com/community/tutorials/an- Знакомство с метаданными капли [метаданные капли], мы будем автоматизировать развертывание нашего сайта. Наконец, мы предоставим скрипт на Ruby, который автоматизирует весь этот процесс и облегчит создание масштабируемых сайтов Wordpress. Из этого руководства вы узнаете о мощности и гибкости пользовательских данных и метаданных Droplet при развертывании служб в DigitalOcean.

Шаг первый - планирование нашего развертывания

Развертывание, которое мы создадим в этом руководстве, будет состоять из одного сервера базы данных MySQL, нескольких серверов GlusterFS в кластере, нескольких веб-серверов Nginx и одного балансировщика нагрузки Nginx.

изображение: https: //assets.digitalocean.com/articles/automate_wp_cluster/wp-cluster.png [Развертывание WordPress]

Прежде чем мы начнем, мы должны знать:

  • Какой размер Droplet мы будем использовать для нашего сервера MySQL

  • Сколько узлов GlusterFS мы создадим

  • Какого размера будут наши узлы GlusterFS

  • Сколько узлов веб-сервера нам понадобится

  • Какой размер капель мы будем использовать для наших веб-серверов?

  • Какой размер капли мы будем использовать для нашего балансировщика нагрузки?

  • Доменное имя, которое мы будем использовать для нашего нового сайта

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

Шаг второй - Развертывание MySQL

Мы начнем с развертывания нашего сервера MySQL. Для этого мы создадим Ubuntu 14.04 x64 Droplet по умолчанию, используя следующие данные пользователя.

#!/bin/bash
export DEBIAN_FRONTEND=noninteractive;
export PUBLIC_IP=$(curl -s http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/address)
export PRIVATE_IP=$(curl -s http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address)
apt-get update;
apt-get -y install mysql-server;
mysqladmin -u root create wordpress;
mysqladmin -u root password "";
sed -i.bak "s/127.0.0.1/$PRIVATE_IP/g" /etc/mysql/my.cnf;
service mysql restart;
mysql -uroot -p -e "CREATE USER 'wordpress'@'%' IDENTIFIED BY ''";
mysql -uroot -p -e "GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'%'";

Этот скрипт пользовательских данных будет выполнять следующие функции на нашем новом Droplet:

Во-первых, мы экспортируем переменную, которая сообщает + apt-get +, что мы работаем в неинтерактивном режиме, чтобы она не запрашивала ввод данных при установке пакетов.

export DEBIAN_FRONTEND=noninteractive;

Далее мы используем метаданные Droplet, чтобы получить публичные и частные IP-адреса Droplet и назначить их переменным:

export PUBLIC_IP=$(curl -s http://169.254.169.254/metadata/v1/interfaces/public/0/ipv4/address)
export PRIVATE_IP=$(curl -s http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address)
Note: Droplet Meta-Data is not available in NYC1, NYC2, and AMS1 at this time.

Затем мы используем + apt + для установки сервера MySQL.

apt-get update;
apt-get -y install mysql-server;

Теперь нам нужно создать новую базу данных под названием * wordpress *.

mysqladmin -u root create wordpress;

Затем мы устанавливаем пароль для нашего пользователя root MySQL.

mysqladmin -u root password "";

Поскольку наш сервер MySQL будет принимать запросы от ваших веб-серверов, нам нужно, чтобы он прослушивал частный IP-адрес, а не только + localhost. Для этого мы будем использовать + sed +, чтобы обновить файл конфигурации MySQL, выполнив поиск и замену, а затем перезапустив службу.

sed -i.bak "s/127.0.0.1/$PRIVATE_IP/g" /etc/mysql/my.cnf;
service mysql restart;

Наконец, мы создадим нового пользователя MySQL с именем * wordpress * и дадим ему разрешение на доступ к базе данных wordpress.

mysql -uroot -p -e "CREATE USER 'wordpress'@'%' IDENTIFIED BY ''";
mysql -uroot -p -e "GRANT ALL PRIVILEGES ON wordpress.* TO 'wordpress'@'%'";

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

Шаг третий - Развертывание GlusterFS

Перед развертыванием нашего кластера GlusterFS нам необходимо решить, сколько узлов мы будем развертывать. Есть две переменные, которые войдут в это решение. Сначала нам нужно решить, сколько места нам нужно, а затем нам нужно определиться с настройкой реплики. Параметр реплики сообщает GlusterFS, сколько копий любого файла нужно сохранить. Например, настройка реплики 2 будет означать, что каждый файл дублируется как минимум на 2 серверах. Это сократит наше доступное хранилище в два раза, так как мы сохраняем две копии каждого файла, но обеспечит улучшенную избыточность. Количество создаваемых нами узлов GlusterFS должно быть кратным нашему параметру реплики. Для кластера с настройкой реплики 2 нам нужно создать наши узлы кратные 2 (поэтому 2, 4, 6 или 8 узлов будут приемлемыми).

В этом примере мы развернем кластер GlusterFS с 4 узлами, используя параметр реплики 2.

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

#!/bin/bash
export DEBIAN_FRONTEND=noninteractive;
apt-get update;
apt-get install -y python-software-properties;
add-apt-repository -y ppa:gluster/glusterfs-3.5;
apt-get update;
apt-get install -y glusterfs-server;

Опять же, сначала мы устанавливаем переменную + DEBIAN_FRONTEND +, чтобы + apt + знал, что мы работаем в неинтерактивном режиме:

export DEBIAN_FRONTEND=noninteractive;

Затем мы обновляем нашу базу данных + apt + и устанавливаем + python-software-properties +, которая необходима для добавления PPA для GlusterFS.

apt-get update;
apt-get install -y python-software-properties;

Далее мы добавим GlusterFS PPA, чтобы мы могли получить наши пакеты deb.

add-apt-repository -y ppa:gluster/glusterfs-3.5;

Затем мы снова обновим нашу базу данных + apt + и установим glusterfs-server.

apt-get install -y glusterfs-server;

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

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

#!/bin/bash
export DEBIAN_FRONTEND=noninteractive;
export PRIVATE_IP=$(curl -s http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address)
apt-get update;
apt-get install -y python-software-properties;
add-apt-repository -y ppa:gluster/glusterfs-3.5;
apt-get update;
apt-get install -y glusterfs-server;
sleep 30;
gluster peer probe ;
gluster peer probe ;
gluster peer probe ;
gluster volume create file_store  transport tcp    $PRIVATE_IP:/gluster force;
gluster volume start file_store;
Note: If you do not want to enable replication you should not include the "replica" setting in your "volume create" command.

Первый раздел этого скрипта пользовательских данных очень похож на тот, который мы использовали на других узлах GlusterFS, хотя мы назначаем частный IP нашего нового Droplet переменной $ PRIVATE_IP. Однако после установки + glusterfs-server + мы проделаем дополнительную работу.

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

sleep 30

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

gluster peer probe ;
gluster peer probe ;
gluster peer probe ;

Далее мы создадим наш том GlusterFS с именем «filestore» с настройкой реплики 2, включающей все четыре наших узла. Поскольку мы не будем знать IP-адрес нашего нового узла, мы будем использовать для него переменную $ PRIVATEIP.

gluster volume create file_store replica 2 transport tcp    $PRIVATE_IP:/gluster force;

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

gluster volume start file_store;

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

Шаг четвертый - Развертывание веб-серверов Nginx

Теперь, когда у нас есть сервер базы данных и распределенная файловая система, мы можем развернуть наши веб-серверы. Мы будем использовать следующий скрипт пользовательских данных для развертывания нашего первого узла веб-сервера Nginx и настройки нашей установки WordPress внутри тома GlusterFS.

#!/bin/bash
export DEBIAN_FRONTEND=noninteractive;
export PRIVATE_IP=$(curl -s http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address)
apt-get update;
apt-get -y install nginx glusterfs-client php5-fpm php5-mysql;
sed -i s/\;cgi\.fix_pathinfo\=1/cgi\.fix_pathinfo\=0/g /etc/php5/fpm/php.ini;
mkdir /gluster;
mount -t glusterfs  /gluster;
echo " /gluster glusterfs defaults,_netdev 0 0" >> /etc/fstab;
mkdir /gluster/www;
wget https://raw.githubusercontent.com/ryanpq/do-wpc/master/default -O /etc/nginx/sites-enabled/default;
service nginx restart;
# Get Wordpress Files
wget https://wordpress.org/latest.tar.gz -O /root/wp.tar.gz;
tar -zxf /root/wp.tar.gz -C /root/;
cp -Rf /root/wordpress/* /gluster/www/.;
cp /gluster/www/wp-config-sample.php /gluster/www/wp-config.php;
sed -i "s/'DB_NAME', 'database_name_here'/'DB_NAME', 'wordpress'/g" /gluster/www/wp-config.php;
sed -i "s/'DB_USER', 'username_here'/'DB_USER', 'wordpress'/g" /gluster/www/wp-config.php;
sed -i "s/'DB_PASSWORD', 'password_here'/'DB_PASSWORD', ''/g" /gluster/www/wp-config.php;
sed -i "s/'DB_HOST', 'localhost'/'DB_HOST', ''/g" /gluster/www/wp-config.php;
chown -Rf www-data:www-data /gluster/www;

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

Сначала мы снова установим переменную + DEBIAN_FRONTEND +, как мы это делали в наших предыдущих скриптах, и заполним нашу переменную + $ PRIVATE_IP +.

export DEBIAN_FRONTEND=noninteractive;
export PRIVATE_IP=$(curl -s http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address)

Затем мы обновим нашу базу данных + apt + и установим Nginx, клиент glusterfs и библиотеки php, которые нам понадобятся.

apt-get update;
apt-get -y install nginx glusterfs-client php5-fpm php5-mysql;

Затем мы будем использовать функциональность поиска и замены + sed + для обновления нашего файла + php.ini + и установки переменной cgi.fixpathinfo в 0.

sed -i s/\;cgi\.fix_pathinfo\=1/cgi\.fix_pathinfo\=0/g /etc/php5/fpm/php.ini;

Теперь мы создадим папку + / gluster + в корне образа диска и смонтируем там том GlusterFS. Затем мы создадим запись fstab, чтобы наш том GlusterFS автоматически монтировался при загрузке Droplet.

mkdir /gluster;
mount -t glusterfs  /gluster;
echo " /gluster glusterfs defaults,_netdev 0 0" >> /etc/fstab;

Затем мы создадим папку с именем + www + в томе GlusterFS. Эта папка будет действовать как наш веб-корень.

mkdir /gluster/www;

Далее мы извлечем новый файл конфигурации Nginx с удаленного сервера. Этот файл установит наш веб-корень на + / gluster / www + и обеспечит настройку Nginx для использования PHP. Вы можете просмотреть этот файл конфигурации here. После того, как мы заменили наш файл конфигурации Nginx, мы перезапустим службу, чтобы изменения вступили в силу.

wget https://raw.githubusercontent.com/ryanpq/do-wpc/master/default -O /etc/nginx/sites-enabled/default;
service nginx restart;

Теперь мы возьмем копию последней версии WordPress, распакуем ее и скопируем ее содержимое в наш новый веб-корень.

wget https://wordpress.org/latest.tar.gz -O /root/wp.tar.gz;
tar -zxf /root/wp.tar.gz -C /root/;
cp -Rf /root/wordpress/* /gluster/www/.;

Далее мы скопируем пример файла конфигурации WordPress в + wp-config.php.

cp /gluster/www/wp-config-sample.php /gluster/www/wp-config.php;

И обновите его переменные, чтобы они соответствовали нашей новой среде, снова используя + sed + 'функцию поиска и замены.

sed -i "s/'DB_NAME', 'database_name_here'/'DB_NAME', 'wordpress'/g" /gluster/www/wp-config.php;
sed -i "s/'DB_USER', 'username_here'/'DB_USER', 'wordpress'/g" /gluster/www/wp-config.php;
sed -i "s/'DB_PASSWORD', 'password_here'/'DB_PASSWORD', ''/g" /gluster/www/wp-config.php;
sed -i "s/'DB_HOST', 'localhost'/'DB_HOST', ''/g" /gluster/www/wp-config.php;

И наконец, мы позаботимся о том, чтобы файлы в нашем веб-корне принадлежали пользователю * www-data *, от имени которого будет работать наш процесс Nginx.

chown -Rf www-data:www-data /gluster/www;

Теперь наш первый узел веб-сервера полностью настроен и готов к приему запросов.

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

#!/bin/bash
export DEBIAN_FRONTEND=noninteractive;
export PRIVATE_IP=$(curl -s http://169.254.169.254/metadata/v1/interfaces/private/0/ipv4/address)
apt-get update;
apt-get -y install nginx glusterfs-client php5-fpm php5-mysql;
sed -i s/\;cgi\.fix_pathinfo\=1/cgi\.fix_pathinfo\=0/g /etc/php5/fpm/php.ini;
mkdir /gluster;
mount -t glusterfs  /gluster;
echo " /gluster glusterfs defaults,_netdev 0 0" >> /etc/fstab;
mkdir /gluster/www;
wget https://raw.githubusercontent.com/ryanpq/do-wpc/master/default -O /etc/nginx/sites-enabled/default;
service nginx restart;

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

Шаг пятый - Развертывание нашего балансировщика нагрузки

Последний шаг в этом развертывании - создание нашего балансировщика нагрузки. Мы будем использовать другой сервер Nginx для этой цели. Для настройки этого узла мы будем использовать следующий скрипт пользовательских данных:

#!/bin/bash
export DEBIAN_FRONTEND=noninteractive;
apt-get update;
apt-get -y install nginx;
lbconf="
server {
   listen 80 default_server;
   listen [::]:80 default_server ipv6only=on;

   root /usr/share/nginx/html;
   index index.php index.html index.htm;

   location / {
     proxy_pass  http://backend;
     include proxy_params;
   }

}

upstream backend  {
   ip_hash;
   server
   server
}
"
echo $lbconf > /etc/nginx/sites-enabled/default;
service nginx restart;

Для сценария пользовательских данных нашего балансировщика нагрузки мы будем создавать нашу конфигурацию Nginx непосредственно в сценарии. Мы начинаем так же, как и с другими нашими Droplets, гарантируя, что + apt + знает, что мы работаем в неинтерактивном режиме.

export DEBIAN_FRONTEND=noninteractive;

Затем мы установим Nginx:

apt-get update;
apt-get -y install nginx;

Далее мы создадим нашу новую конфигурацию Nginx в переменной с именем + lbconf +. Добавление записи для каждого из наших веб-серверов в разделе upstream backend.

lbconf="
server {
   listen 80 default_server;
   listen [::]:80 default_server ipv6only=on;

   root /usr/share/nginx/html;
   index index.php index.html index.htm;

   location / {
     proxy_pass  http://backend;
     include proxy_params;
   }

}

upstream backend  {
   ip_hash;
   server
   server
}
"

Затем мы запишем переменную + lbconf + в наш файл конфигурации Nginx, заменив его текущее содержимое.

echo $lbconf > /etc/nginx/sites-enabled/default;

И наконец, мы перезапустим Nginx, чтобы эта конфигурация вступила в силу.

service nginx restart;

Шаг шестой - Настройка DNS

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

На панели управления DigitalOcean нажмите * DNS *. В форме * Добавить домен * введите свое доменное имя и выберите в раскрывающемся меню свой балансировщик нагрузки, а затем нажмите * Создать домен *.

Чтобы использовать субдомен * www * для своего сайта, вам нужно создать еще одну запись в этом новом домене.

Нажмите * Добавить запись * и выберите тип записи * CNAME *. В поле имени введите * www *, а в поле имени хоста введите * @ *. Это перенаправит запросы на субдомен www в то же место, что и ваш основной домен (ваш балансировщик нагрузки Droplet).

Шаг седьмой - Настройка WordPress

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

изображение: https: //assets.digitalocean.com/articles/automate_wp_cluster/wp-setup.png [Настройка Wordpress]

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

Шаг восьмой - Автоматизация процесса

Теперь, когда мы можем создать наше развертывание WordPress без необходимости использовать ssh в Droplet, мы можем сделать еще один шаг вперед и автоматизировать этот процесс, используя DigitalOcean API.

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

Заключение

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

Related