Automatisieren der Bereitstellung einer skalierbaren WordPress-Site

Einführung

In diesem Handbuch erstellen und implementieren wir eine skalierbare WordPress-Instanz, die aus einem MySQL-Datenbankserver, einem verteilten GlusterFS-Dateisystem, Nginx-Webservern und einem Nginx-Load-Balancer besteht. Unter Verwendung von user-data und https://www.digitalocean.com/community/tutorials/an- Einführung-in-Droplet-Metadaten [Droplet-Metadaten], werden wir die Bereitstellung unserer Website automatisieren. Schließlich stellen wir ein Ruby-Skript zur Verfügung, das diesen gesamten Prozess automatisiert und die Erstellung skalierbarer Wordpress-Sites erleichtert. In diesem Tutorial lernen Sie die Leistungsfähigkeit und Flexibilität von Benutzerdaten und Droplet-Metadaten bei der Bereitstellung von Diensten auf DigitalOcean kennen.

Erster Schritt - Planung unserer Bereitstellung

Die Bereitstellung, die wir in diesem Lernprogramm erstellen, besteht aus einem einzelnen MySQL-Datenbankserver, mehreren GlusterFS-Servern in einem Cluster, mehreren Nginx-Webservern und einem einzelnen Nginx-Load-Balancer.

Bevor wir anfangen, sollten wir wissen:

  • Welche Droplet-Größe verwenden wir für unseren MySQL-Server?

  • Wie viele GlusterFS-Knoten werden erstellt?

  • Wie groß werden unsere GlusterFS-Knoten sein?

  • Wie viele Webserverknoten benötigen wir?

  • Welche Tropfengröße werden wir für unsere Webserver verwenden?

  • Welche Tropfengröße verwenden wir für unseren Load Balancer?

  • Den Domainnamen, den wir für unsere neue Site verwenden werden

Wir können zusätzliche Knoten hinzufügen oder die von uns erstellten Knoten skalieren, wenn wir dies später benötigen. Sobald wir uns für diese Details entschieden haben, können wir mit der Bereitstellung unserer Website beginnen.

Zweiter Schritt - Bereitstellung von MySQL

Wir beginnen mit der Bereitstellung unseres MySQL-Servers. Dazu erstellen wir ein Ubuntu 14.04 x64 Droplet mit den folgenden Benutzerdaten.

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

Dieses Benutzerdatenskript führt die folgenden Funktionen in unserem neuen Droplet aus:

Zuerst exportieren wir eine Variable, die "+ apt-get +" mitteilt, dass wir im nicht interaktiven Modus ausgeführt werden, um zu verhindern, dass sie bei der Installation von Paketen zur Eingabe auffordert.

export DEBIAN_FRONTEND=noninteractive;

Als Nächstes verwenden wir Droplet-Metadaten, um die öffentlichen und privaten IP-Adressen des Droplets abzurufen und Variablen zuzuweisen:

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.

Wir verwenden dann "+ apt +", um den MySQL-Server zu installieren.

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

Jetzt müssen wir eine neue Datenbank mit dem Namen * wordpress * erstellen.

mysqladmin -u root create wordpress;

Dann setzen wir ein Passwort für unseren MySQL-Root.

mysqladmin -u root password "";

Da unser MySQL-Server Anfragen von Ihren Webservern akzeptiert, muss er die private IP-Adresse abhören und nicht nur "+ localhost". Dazu aktualisieren wir die MySQL-Konfigurationsdatei mit + sed +, indem wir den Dienst suchen und ersetzen und anschließend neu starten.

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

Zuletzt erstellen wir einen neuen MySQL-Benutzer mit dem Namen * wordpress * und erteilen ihm die Erlaubnis, auf die wordpress-Datenbank zuzugreifen.

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

Durch die Bereitstellung unseres neuen Droplets mit diesem Benutzerdatenskript lauscht ein konfigurierter MySQL-Server auf seiner privaten IP-Adresse und mit unserer konfigurierten Datenbank und dem konfigurierten Benutzer, ohne sich jemals über SSH oder die Konsole anzumelden.

Schritt drei - Bereitstellen von GlusterFS

Bevor Sie unseren GlusterFS-Cluster bereitstellen, müssen Sie festlegen, wie viele Knoten bereitgestellt werden sollen. Es gibt zwei Variablen, die in diese Entscheidung einfließen. Zuerst müssen wir entscheiden, wie viel Speicherplatz wir benötigen, und dann müssen wir uns für eine zu verwendende Replikateinstellung entscheiden. Die Replikateinstellung teilt GlusterFS mit, wie viele Kopien einer Datei gespeichert werden sollen. Beispielsweise bedeutet eine Replikateinstellung von 2, dass jede Datei auf mindestens 2 Servern dupliziert wird. Dadurch wird der verfügbare Speicherplatz halbiert, da wir zwei Kopien jeder Datei behalten, aber die Redundanz verbessern. Die Anzahl der von uns erstellten GlusterFS-Knoten muss ein Vielfaches unserer Replikateinstellung sein. Für einen Cluster mit einer Replikateinstellung von 2 müssen wir unsere Knoten in einem Vielfachen von 2 erstellen (2, 4, 6 oder 8 Knoten wären also akzeptabel).

In diesem Beispiel wird ein 4-Knoten-GlusterFS-Cluster mit der Replikateinstellung 2 bereitgestellt.

Für unsere ersten 3 Knoten verwenden wir das folgende Benutzerdatenskript:

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

Wieder setzen wir zuerst die Variable "+ DEBIAN_FRONTEND ", damit " apt +" weiß, dass wir im nicht interaktiven Modus ausgeführt werden:

export DEBIAN_FRONTEND=noninteractive;

Wir aktualisieren dann unsere "+ apt " - Datenbank und installieren " python-software-properties +", um das PPA für GlusterFS hinzuzufügen.

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

Als nächstes werden wir den GlusterFS PPA hinzufügen, damit wir unsere Deb-Pakete bekommen können.

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

Dann werden wir unsere + apt + Datenbank erneut aktualisieren und den glusterfs-Server installieren.

apt-get install -y glusterfs-server;

Für unsere ersten drei Knoten ist dies alles, was wir tun müssen. Notieren Sie sich die privaten IP-Adressen, die jedem dieser neuen Droplets zugewiesen sind, da diese beim Erstellen unseres letzten GlusterFS-Knotens und beim Erstellen unseres Volumes benötigt werden.

Für unseren letzten Knoten verwenden wir das folgende Benutzerdatenskript:

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

Der erste Abschnitt dieses Benutzerdatenskripts ähnelt demjenigen, den wir auf den anderen GlusterFS-Knoten verwendet haben, obwohl wir der Variablen $ PRIVATE_IP die private IP unseres neuen Droplets zuweisen. Sobald "+ glusterfs-server +" installiert ist, erledigen wir einige zusätzliche Arbeiten.

Zuerst wartet unser Skript 30 Sekunden, bis der neue glusterfs-Server hochgefahren und verfügbar ist.

sleep 30

Dann prüfen wir die drei GlusterFS-Tröpfchen, die wir zuvor erstellt haben, um alle vier zu einem Cluster hinzuzufügen.

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

Als Nächstes erstellen wir unser GlusterFS-Volume mit dem Namen "filestore" mit der Replikateinstellung 2 und allen vier Knoten. Da wir die IP-Adresse unseres neuesten Knotens noch nicht kennen, verwenden wir dafür die Variable $ PRIVATEIP.

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

Schließlich werden wir den neuen Band starten, um ihn unseren Kunden zugänglich zu machen:

gluster volume start file_store;

Wir haben jetzt ein verteiltes Dateisystem, in dem wir unsere WordPress-Dateien aufbewahren können, auf die alle unsere Webserverknoten zugreifen können.

Vierter Schritt - Bereitstellung von Nginx-Webservern

Nachdem wir nun einen Datenbankserver und ein verteiltes Dateisystem eingerichtet haben, können wir unsere Webserver bereitstellen. Wir werden das folgende Benutzerdatenskript verwenden, um unseren ersten Nginx-Webserverknoten bereitzustellen und unsere WordPress-Installation in unserem GlusterFS-Volume zu konfigurieren.

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

Dieses Skript ist etwas komplizierter als unsere vorherigen, also lasst es uns Schritt für Schritt aufschlüsseln.

Zuerst setzen wir wieder die Variable "+ DEBIAN_FRONTEND " wie in unseren vorherigen Skripten und füllen unsere Variable " $ PRIVATE_IP +".

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

Als nächstes werden wir unsere "+ apt +" - Datenbank aktualisieren und Nginx, den glusterfs-Client und die benötigten PHP-Bibliotheken installieren.

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

Dann verwenden wir die Such- und Ersetzungsfunktion von "+ sed ", um unsere " php.ini +" - Datei zu aktualisieren und die Variable "cgi.fixpathinfo" auf 0 zu setzen.

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

Jetzt erstellen wir einen Ordner mit dem Namen "+ / gluster +" im Stammverzeichnis unseres Festplattenabbilds und hängen dort unser GlusterFS-Volume ein. Dann erstellen wir einen fstab-Eintrag, damit unser GlusterFS-Volume beim Booten des Droplets automatisch gemountet wird.

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

Dann erstellen wir einen Ordner mit dem Namen "+ www +" in unserem GlusterFS-Volume. Dieser Ordner fungiert als Webstamm.

mkdir /gluster/www;

Als Nächstes ziehen wir eine neue Nginx-Konfigurationsdatei von einem Remote-Server. Diese Datei setzt unser Web-Stammverzeichnis auf "+ / gluster / www +" und stellt sicher, dass Nginx für die Verwendung von PHP konfiguriert ist. Sie können diese Konfigurationsdatei here anzeigen. Sobald wir unsere Nginx-Konfigurationsdatei ersetzt haben, werden wir den Dienst neu starten, damit diese Änderung wirksam wird.

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

Jetzt holen wir uns eine Kopie der neuesten Version von WordPress, extrahieren sie und kopieren ihren Inhalt in unser neues Webstammverzeichnis.

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

Als nächstes kopieren wir die WordPress-Beispielkonfigurationsdatei nach + wp-config.php.

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

Aktualisieren Sie die Variablen, um sie an die neue Umgebung anzupassen, und verwenden Sie dabei erneut die Such- und Ersetzungsfunktion von "+ 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;

Schließlich stellen wir sicher, dass die Dateien in unserem Webstamm dem Benutzer * www-data * gehören, unter dem unser Nginx-Prozess ausgeführt wird.

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

Wir haben jetzt unseren ersten Webserverknoten eingerichtet und sind bereit, Anfragen zu empfangen.

Da jeder unserer Webserverknoten dasselbe GlusterFS-Volume für die Speicherung verwendet, sind für jeden zusätzlichen Knoten, den wir erstellen, weniger Schritte erforderlich. Für zusätzliche Knoten verwenden wir das folgende Benutzerdatenskript:

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

Für unsere zusätzlichen Webknoten werden wir weiterhin dieselben Pakete installieren, unser GlusterFS-Volume mounten und unsere Nginx-Konfigurationsdatei ersetzen, aber wir müssen keine Einrichtung unserer WordPress-Instanz vornehmen, da wir dies beim Erstellen unseres ersten Knotens getan haben.

Fünfter Schritt - Bereitstellung unseres Load Balancers

Der letzte Schritt bei dieser Bereitstellung ist das Erstellen unseres Lastenausgleichs. Zu diesem Zweck verwenden wir einen anderen Nginx-Server. Zum Einrichten dieses Knotens verwenden wir das folgende Benutzerdatenskript:

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

Für das Benutzerdatenskript unseres Lastenausgleichs erstellen wir die Nginx-Konfiguration direkt im Skript. Wir fangen ähnlich wie bei unseren anderen Droplets an, indem wir sicherstellen, dass "+ apt +" weiß, dass wir im nicht interaktiven Modus ausgeführt werden.

export DEBIAN_FRONTEND=noninteractive;

Dann installieren wir Nginx:

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

Als nächstes erstellen wir unsere neue Nginx-Konfiguration in einer Variablen namens "+ lbconf +". Hinzufügen eines Eintrags für jeden unserer Webserver im Abschnitt 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
}
"

Anschließend schreiben wir die Variable "+ lbconf +" in unsere Nginx-Konfigurationsdatei und ersetzen deren aktuellen Inhalt.

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

Abschließend starten wir Nginx neu, damit diese Konfiguration wirksam wird.

service nginx restart;

Schritt Sechs - Einrichten von DNS

Bevor wir nun über den Browser auf unsere neue WordPress-Site zugreifen, sollten wir einen DNS-Eintrag dafür einrichten. Wir werden dies über das Bedienfeld tun.

Klicken Sie in der DigitalOcean-Systemsteuerung auf * DNS *. Geben Sie im Formular "Domain hinzufügen" Ihren Domainnamen ein und wählen Sie Ihr Load-Balancer-Droplet aus dem Dropdown-Menü aus. Klicken Sie dann auf "Domain erstellen".

Um die Subdomain * www * für Ihre Site zu verwenden, müssen Sie einen weiteren Datensatz in dieser neuen Domain erstellen.

Klicken Sie auf * Datensatz hinzufügen * und wählen Sie den Datensatztyp * CNAME *. Geben Sie im Feld Name * www * und im Feld Hostname * @ * ein. Dadurch werden Anforderungen für die www-Unterdomäne an denselben Speicherort wie Ihre Hauptdomäne (Ihr Droplet für den Lastenausgleich) geleitet.

Schritt Sieben - Konfigurieren von WordPress

Nachdem wir alle unsere Droplets gestartet und unsere Domain konfiguriert haben, können wir auf unsere neue WordPress-Site zugreifen, indem wir unsere neu konfigurierte Domain in einem Webbrowser besuchen.

Wir werden hier aufgefordert, ein Benutzerkonto zu erstellen und unserer neuen Site einen Namen zu geben. Sobald wir dies getan haben, ist unsere Bereitstellung abgeschlossen und wir können mit der Verwendung der neuen Site beginnen.

Schritt acht - Automatisierung des Prozesses

Jetzt, da wir unsere WordPress-Bereitstellung erstellen können, ohne jemals in ein Droplet ssh müssen, können wir noch einen Schritt weiter gehen und diesen Prozess mithilfe der DigitalOcean API automatisieren.

Basierend auf diesem Tutorial wurde ein Ruby-Beispielskript erstellt, das den Benutzer auffordert, die relevanten Details einzugeben und dann automatisch eine neue skalierbare WordPress-Instanz bereitzustellen. Sie finden dieses Skript unter on GitHub.

Fazit

Wir haben jetzt eine skalierbare WordPress-Bereitstellung, aber es gibt zusätzliche Schritte, die wir unternehmen können, um sicherzustellen, dass unsere neue Site sicher und stabil ist.