Automatisation du déploiement d’un site WordPress évolutif

introduction

Dans ce guide, nous allons créer et déployer une instance WordPress évolutive composée d’un serveur de base de données MySQL, d’un système de fichiers distribué GlusterFS, de serveurs Web Nginx et d’un équilibreur de charge Nginx. En utilisant user-data et https://www.digitalocean.com/community/tutorials/an- introduction-to-droplet-metadata [méta-données Droplet], nous allons automatiser le déploiement de notre site. Enfin, nous fournirons un script Ruby qui automatisera tout ce processus et facilitera la création de sites Wordpress évolutifs. À travers ce didacticiel, vous découvrirez la puissance et la flexibilité des méta-données de données utilisateur et Droplet lors du déploiement de services sur DigitalOcean.

Première étape - Planifier notre déploiement

Le déploiement que nous créons dans ce didacticiel consistera en un seul serveur de base de données MySQL, plusieurs serveurs GlusterFS dans un cluster, plusieurs serveurs Web Nginx et un seul équilibreur de charge Nginx.

image: https: //assets.digitalocean.com/articles/automate_wp_cluster/wp-cluster.png [Déploiement de WordPress]

Avant de commencer, nous devrions savoir:

  • Quelle taille Droplet nous allons utiliser pour notre serveur MySQL

  • Combien de nœuds GlusterFS nous allons créer

  • Quelle sera la taille de nos nœuds GlusterFS

  • Combien de nœuds de serveur Web nous aurons besoin

  • Quelle taille de gouttelettes nous allons utiliser pour nos serveurs Web

  • Quelle taille Droplet nous allons utiliser pour notre équilibreur de charge

  • Le nom de domaine que nous allons utiliser pour notre nouveau site

Nous pouvons ajouter des nœuds supplémentaires ou augmenter la taille des nœuds que nous avons créés si nous en avons besoin ultérieurement. Une fois que nous avons décidé de ces détails, nous pouvons commencer à déployer notre site.

Deuxième étape - Déploiement de MySQL

Nous allons commencer par déployer notre serveur MySQL. Pour ce faire, nous allons créer une droplet Ubuntu 14.04 x64 par défaut en utilisant les données utilisateur suivantes.

#!/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'@'%'";

Ce script de données utilisateur remplira les fonctions suivantes sur notre nouveau Droplet:

Premièrement, nous exportons une variable qui indique à + ​​apt-get + que nous fonctionnons en mode non interactif pour l’empêcher d’inviter toute entrée lors de l’installation de packages.

export DEBIAN_FRONTEND=noninteractive;

Nous utilisons ensuite les métadonnées de Droplet pour obtenir les adresses IP publiques et privées de Droplet et les attribuer à des variables:

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.

Nous utilisons ensuite + apt + pour installer le serveur MySQL.

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

Nous devons maintenant créer une nouvelle base de données appelée * wordpress *.

mysqladmin -u root create wordpress;

Ensuite, nous définissons un mot de passe pour notre utilisateur root MySQL.

mysqladmin -u root password "";

Parce que notre serveur MySQL acceptera les requêtes de nos serveurs Web, nous devons le laisser écouter sur l’adresse IP privée plutôt que seulement sur + localhost +. Pour ce faire, nous allons utiliser + sed + pour mettre à jour le fichier de configuration MySQL en effectuant une recherche et un remplacement, puis en redémarrant le service.

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

Enfin, nous allons créer un nouvel utilisateur MySQL appelé * wordpress * et lui donner la permission d’accéder à la base de données wordpress.

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

En déployant notre nouvelle Droplet avec ce script de données utilisateur, nous aurons un serveur MySQL configuré qui écoute sur son adresse IP privée et avec notre base de données et notre utilisateur configurés sans jamais se connecter via SSH ou la console.

Troisième étape - Déploiement de GlusterFS

Avant de déployer notre cluster GlusterFS, nous devons décider du nombre de nœuds à déployer. Il y a deux variables qui vont entrer dans cette décision. Nous devons d’abord décider de l’espace dont nous avons besoin, puis du choix du paramètre de réplica à utiliser. Le paramètre de réplique indique à GlusterFS le nombre de copies d’un fichier à stocker. Par exemple, un paramètre de réplica égal à 2 signifie que chaque fichier est dupliqué sur au moins deux serveurs. Cela réduira de moitié notre espace de stockage disponible, car nous conservons deux copies de chaque fichier, tout en améliorant la redondance. Le nombre de nœuds GlusterFS que nous créons doit être un multiple de notre paramètre de réplica. Pour un cluster avec un paramètre de réplica égal à 2, nous devrons créer nos nœuds dans un multiple de 2 (donc, 2, 4, 6 ou 8 nœuds seraient acceptables).

Pour cet exemple, nous allons déployer un cluster GlusterFS à 4 nœuds en utilisant un paramètre de réplica de 2.

Pour nos 3 premiers nœuds, nous utiliserons le script utilisateur suivant:

#!/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;

De nouveau, nous avons d’abord défini la variable + DEBIAN_FRONTEND + afin que + apt + sache que nous fonctionnons en mode non interactif:

export DEBIAN_FRONTEND=noninteractive;

Nous mettons ensuite à jour notre base de données + apt + et installons + python-software-properties +, qui est nécessaire pour ajouter le PPA pour GlusterFS.

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

Nous ajouterons ensuite le PPA GlusterFS afin de pouvoir récupérer nos paquets deb.

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

Ensuite, nous mettrons à nouveau notre base de données + apt + et installerons glusterfs-server.

apt-get install -y glusterfs-server;

Pour nos trois premiers nœuds, c’est tout ce que nous devons faire. Notez les adresses IP privées attribuées à chacune de ces nouvelles Droplets, car nous en aurons besoin lors de la création de notre dernier noeud GlusterFS et de la création de notre volume.

Pour notre dernier noeud, nous allons utiliser le script utilisateur suivant:

#!/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.

La première section de ce script de données utilisateur est assez similaire à celle utilisée sur les autres nœuds GlusterFS, bien que nous assignions l’adresse IP privée de notre nouveau Droplet à la variable $ PRIVATE_IP. Une fois que + glusterfs-server + est installé, nous effectuons un travail supplémentaire.

Tout d’abord, notre script attendra 30 secondes pour que le nouveau serveur glusterfs puisse démarrer et être disponible.

sleep 30

Nous analysons ensuite les trois Droplets GlusterFS que nous avons créés précédemment afin de les ajouter tous à un cluster.

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

Nous allons ensuite créer notre volume GlusterFS nommé «fichierstore» avec un paramètre de réplica de 2 et incluant les quatre nœuds. Comme nous ne connaîtrons pas l’adresse IP de notre plus récent nœud, nous utiliserons pour cela la variable $ PRIVATEIP.

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

Enfin, nous allons commencer le nouveau volume pour le rendre accessible à nos clients:

gluster volume start file_store;

Nous avons maintenant un système de fichiers distribué où nous pouvons conserver nos fichiers WordPress qui seront accessibles à tous nos nœuds de serveurs Web.

Quatrième étape - Déploiement des serveurs Web Nginx

Maintenant que nous avons un serveur de base de données et un système de fichiers distribué, nous pouvons déployer nos serveurs Web. Nous allons utiliser le script utilisateur suivant pour déployer notre premier nœud de serveur Web Nginx et configurer notre installation WordPress dans notre volume 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;

Ce script est un peu plus compliqué que nos précédents, alors décomposons-le étape par étape.

Premièrement, nous allons à nouveau définir la variable + DEBIAN_FRONTEND + comme dans nos scripts précédents et renseigner notre variable + $ PRIVATE_IP +.

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

Ensuite, nous mettrons à jour notre base de données + apt + et installerons Nginx, le client glusterfs, et les bibliothèques php dont nous aurons besoin.

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

Nous utiliserons ensuite la fonctionnalité de recherche et de remplacement de + sed + pour mettre à jour notre fichier` + php.ini + `et définir la variable cgi.fixpathinfo sur 0.

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

Nous allons maintenant créer un dossier appelé + / gluster + à la racine de notre image disque et y monter notre volume GlusterFS. Nous allons ensuite créer une entrée fstab pour que notre volume GlusterFS soit automatiquement monté au démarrage de Droplet.

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

Ensuite, nous allons créer un dossier nommé + www + dans notre volume GlusterFS. Ce dossier agira comme notre racine Web.

mkdir /gluster/www;

Ensuite, nous allons extraire un nouveau fichier de configuration Nginx d’un serveur distant. Ce fichier définira notre racine Web sur + / gluster / www + et garantira que Nginx est configuré pour utiliser PHP. Vous pouvez afficher ce fichier de configuration à l’adresse here. Une fois que nous aurons remplacé notre fichier de configuration Nginx, nous redémarrerons le service pour que cette modification soit prise en compte.

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

Nous allons maintenant récupérer une copie de la dernière version de WordPress, l’extraire et copier son contenu dans notre nouvelle racine Web.

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/.;

Ensuite, nous allons copier le fichier de configuration exemple WordPress dans + wp-config.php.

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

Et mettez à jour ses variables pour qu’elles correspondent à notre nouvel environnement, en utilisant à nouveau la fonction de recherche et de remplacement de 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;

Enfin, nous nous assurerons que les fichiers de notre racine Web appartiennent à l’utilisateur * www-data * sous lequel notre processus Nginx sera exécuté.

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

Nous avons maintenant notre premier nœud de serveur Web configuré et prêt à recevoir les demandes.

Étant donné que chacun de nos nœuds de serveur Web partage le même volume GlusterFS pour le stockage, il y a moins d’étapes pour chaque nœud supplémentaire créé. Pour les nœuds supplémentaires, nous utiliserons le script de données utilisateur suivant:

#!/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;

Pour nos nœuds Web supplémentaires, nous installerons toujours les mêmes packages, monterons notre volume GlusterFS et remplacerons notre fichier de configuration Nginx, mais nous n’aurons pas besoin de configurer l’instance WordPress puisque nous l’avons fait lors de la création de notre premier nœud.

Cinquième étape - Déploiement de notre équilibreur de charge

La dernière étape de ce déploiement consiste à créer notre équilibreur de charge. Nous utiliserons un autre serveur Nginx à cette fin. Pour configurer ce nœud, nous utiliserons le script utilisateur suivant:

#!/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;

Pour le script de données utilisateur de notre équilibreur de charge, nous allons construire notre configuration Nginx directement dans le script. Nous commençons un peu comme nous avons fait avec nos autres Droplets en nous assurant que + apt + sait que nous fonctionnons en mode non interactif.

export DEBIAN_FRONTEND=noninteractive;

Ensuite, nous installerons Nginx:

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

Ensuite, nous allons créer notre nouvelle configuration Nginx dans une variable appelée + lbconf +. Ajout d’une entrée pour chacun de nos serveurs Web dans la section backend_ en amont.

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
}
"

Nous écrirons ensuite la variable + lbconf + dans notre fichier de configuration Nginx, en remplaçant son contenu actuel.

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

Enfin, nous relancerons Nginx pour que cette configuration prenne effet.

service nginx restart;

Sixième étape - Configurer DNS

Maintenant, avant d’accéder à notre nouveau site WordPress via le navigateur, nous devons configurer une entrée DNS pour celui-ci. Nous le ferons via le panneau de contrôle.

Dans le panneau de configuration de DigitalOcean, cliquez sur * DNS *. Dans le formulaire * Ajouter un domaine *, entrez votre nom de domaine et sélectionnez votre droplet d’équilibrage de charge dans le menu déroulant, puis cliquez sur * Créer un domaine *.

Pour utiliser le sous-domaine * www * sur votre site, vous devez créer un autre enregistrement dans ce nouveau domaine.

Cliquez sur * Ajouter un enregistrement * et choisissez le type d’enregistrement * CNAME *. Dans le champ Nom, entrez * www * et dans le champ Nom d’hôte, entrez * @ *. Cela dirigera les demandes du sous-domaine www vers le même emplacement que votre domaine principal (votre droplet d’équilibrage de charge).

Septième étape - Configurer WordPress

Maintenant que nous avons lancé toutes nos gouttelettes et configuré notre domaine, nous pouvons accéder à notre nouveau site WordPress en visitant notre nouveau domaine configuré dans un navigateur Web.

image: https: //assets.digitalocean.com/articles/automate_wp_cluster/wp-setup.png [Configurer Wordpress]

Nous serons invités à créer un compte utilisateur et à donner un nom à notre nouveau site. Une fois cela fait, notre déploiement est terminé et nous pouvons commencer à utiliser le nouveau site.

Étape huit - Automatisation du processus

Maintenant que nous pouvons créer notre déploiement WordPress sans jamais avoir besoin de ssh dans une Droplet, nous pouvons aller encore plus loin et automatiser ce processus à l’aide de l’API DigitalOcean.

Un exemple de script Ruby a été créé sur la base de ce didacticiel, qui invite l’utilisateur à fournir les détails pertinents, puis à déployer automatiquement une nouvelle instance scablable de WordPress. Vous pouvez trouver ce script on GitHub.

Conclusion

Nous avons maintenant un déploiement WordPress évolutif, mais nous pouvons prendre des mesures supplémentaires pour nous assurer que notre nouveau site est sécurisé et stable.