Building for Production: Applications Web - Déploiement

introduction

Dans cette partie du didacticiel, nous allons déployer notre exemple d’application PHP, WordPress, et un DNS privé:

image: https: //assets.digitalocean.com/articles/architecture/production/lamp/dns_application.png [Schéma d’application DNS +]

Vos utilisateurs accéderont à votre application via HTTPS via un nom de domaine, par exemple. “Https://www.example.com”, qui pointe vers l’équilibreur de charge. L’équilibreur de charge agira en tant que proxy inverse sur les serveurs d’applications, qui se connecteront au serveur de base de données. Le DNS privé nous permettra d’utiliser des noms pour faire référence aux adresses de réseau privé de nos serveurs, ce qui facilite le processus de configuration de nos serveurs.

Nous allons configurer les composants que nous venons de discuter sur six serveurs, dans cet ordre:

  • DNS privé (ns1 et ns2)

  • Serveur de base de données (db1)

  • Serveurs d’applications (app1 et app2)

  • Equilibreur de charge (lb1)

Commençons par la configuration DNS.

Serveurs DNS privés

L’utilisation de noms d’adresses facilite l’identification des serveurs sur lesquels vous travaillez et devient essentielle pour la maintenance d’une configuration de serveur plus grande, car vous pouvez remplacer un serveur en mettant simplement à jour vos enregistrements DNS (à un seul endroit) au lieu de mettre à jour d’innombrables fichiers de configuration. Adresses IP. Dans notre configuration, nous allons configurer notre DNS afin que nous puissions référencer les adresses de réseau privé de nos serveurs par nom plutôt que par adresse IP.

Nous nous référerons à l’adresse réseau privée de chaque serveur par un nom d’hôte situé dans le sous-domaine «nyc3.example.com». Par exemple, l’adresse réseau privée du serveur de base de données serait «db1.nyc3.example.com», ce qui correspond à son adresse IP privée. Notez que l’exemple de sous-domaine est presque complètement arbitraire et qu’il est généralement choisi en fonction d’une organisation logique. dans notre cas, nous «nyc3» indique que les serveurs se trouvent dans le centre de données NYC3 et «exemple.com» est le nom de domaine de notre application.

Configurez-le en suivant ce didacticiel et en ajoutant des enregistrements DNS pour chaque serveur de votre configuration:

Une fois le didacticiel DNS terminé, vous devez disposer de deux serveurs BIND: * ns1 * et * ns2 *. Si vous connaissez déjà les adresses IP privées de tous les serveurs de votre configuration, ajoutez-les maintenant à votre DNS. sinon, ajoutez les enregistrements DNS appropriés lors de la création de vos serveurs.

Nous sommes maintenant prêts à configurer votre serveur de base de données.

Configurer le serveur de base de données

Parce que nous voulons équilibrer la charge de nos serveurs d’applications, c’est-à-dire Pour ceux qui utilisent Apache et PHP, nous devons dissocier la base de données des serveurs d’applications en la configurant sur un serveur séparé. Découpler la base de données de l’application est une étape essentielle avant de mettre à l’échelle horizontalement de nombreux types d’applications, comme expliqué dans ce billet de blog: Horizontally Scaling Applications PHP: Un aperçu pratique.

Cette section couvre toutes les étapes nécessaires à la configuration de notre serveur de base de données, mais vous pouvez en apprendre davantage sur la configuration d’un serveur de base de données MySQL distant et découplé pour une application PHP dans ce tutoriel: https://www.digitalocean.com/community/ tutoriels / comment-configurer-une-base-de-données-distante-pour-optimiser-la-performance-du-site-avec-mysql [Comment configurer une base de données MySQL distante].

Installer MySQL

Sur le serveur de base de données, * db1 *, installez MySQL Server:

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

Entrez votre mot de passe root MySQL souhaité à l’invite.

Maintenant, lancez:

sudo mysql_install_db
sudo mysql_secure_installation

Vous devrez entrer le mot de passe de l’administrateur MySQL que vous avez défini dans les étapes ci-dessus. Ensuite, il vous sera demandé si vous souhaitez changer ce mot de passe. Tapez «N» pour non si vous êtes satisfait de votre mot de passe actuel. Répondez au reste des questions avec les valeurs par défaut.

Configurer MySQL pour écouter sur une interface réseau privée

Ouvrez le fichier de configuration MySQL:

sudo vi /etc/mysql/my.cnf

Recherchez le paramètre + bind-address +, et remplacez-le par l’adresse de l’adresse réseau privée de votre serveur de base de données:

/etc/mysql/my.cnf

bind-address            =

Sauvegarder et quitter.

Redémarrez MySQL:

sudo service mysql restart

Configurer la base de données et les utilisateurs de la base de données

Nous devons maintenant créer la base de données et les utilisateurs de base de données que les serveurs d’applications utiliseront pour se connecter.

Entrez la console MySQL:

mysql -u root -p

Entrez le mot de passe root MySQL à l’invite.

À l’invite de MySQL, créez la base de données pour votre application:

CREATE DATABASE ;

MySQL associe ses utilisateurs aux serveurs à partir desquels ils devraient se connecter. Dans notre cas, nous avons deux serveurs d’applications qui vont se connecter, nous devrions donc créer un utilisateur pour chacun d’eux. Créez un utilisateur de base de données, "appuser" dans notre exemple, auquel vous pouvez vous connecter à partir de l’adresse réseau privée de chacun de vos serveurs d’applications (* app1 * et * app2 *). Vous devez utiliser le même mot de passe pour chaque utilisateur:

CREATE USER ''@'' IDENTIFIED BY '';
CREATE USER ''@'' IDENTIFIED BY '';

Nous configurerons les privilèges d’utilisateur final de la base de données ultérieurement, mais donnons à * appuser * le contrôle total sur la * base de données * app *:

GRANT ALL PRIVILEGES ON .* TO ''@'';
GRANT ALL PRIVILEGES ON .* TO ''@'';
FLUSH PRIVILEGES;

Ces privilèges assouplis garantissent que le programme d’installation de l’application pourra l’installer dans la base de données. Si vous avez plus de deux serveurs d’applications, vous devez créer maintenant tous les utilisateurs de base de données nécessaires.

Quittez l’invite MySQL maintenant:

exit

La configuration du serveur de base de données est terminée. Configurons les serveurs d’application.

Configurer les serveurs d’applications

Les serveurs d’application exécuteront le code de notre application, qui se connectera au serveur de base de données. Notre exemple d’application est WordPress, une application PHP servie par un serveur Web tel qu’Apache ou Nginx. Parce que nous voulons équilibrer la charge des serveurs d’applications, nous allons en créer deux identiques.

Cette section couvre toutes les étapes nécessaires à la configuration de nos serveurs d’applications, mais le sujet est traité en détail dans le tutoriel suivant, à partir de la section * Configuration du serveur Web *: https://www.digitalocean.com/community / tutorials / comment-configurer-une-base-de-données-distante-pour-optimiser-la-performance-du-site-avec-mysql [Comment configurer une base de données distante].

Installer Apache et PHP

Sur les deux serveurs d’applications * app1 * et * app2 *, installez Apache et PHP:

sudo apt-get update
sudo apt-get -y install apache2 php5-mysql php5 libapache2-mod-php5 php5-mcrypt

Configurer Apache

Nous allons utiliser HAProxy, sur le serveur de l’équilibreur de charge, pour gérer la terminaison SSL. Nous ne voulons donc pas que nos utilisateurs accèdent directement aux serveurs d’application. En tant que tel, nous lierons Apache à l’adresse réseau privée de chaque serveur.

Sur chaque serveur d’applications, * app1 * et * app2 *, ouvrez votre fichier de configuration des ports Apache. Par défaut, il s’agit du fichier + ports.conf +:

sudo vi /etc/apache2/ports.conf

Recherchez la ligne qui dit + Listen 80 +, et ajoutez-y votre adresse IP privée, comme suit (remplacez par l’adresse IP réelle de votre serveur):

Apache ports.conf - Écouter sur une interface privée

Listen :80

Sauvegarder et quitter. Cela configure Apache pour qu’il écoute uniquement sur l’interface réseau privée, ce qui signifie qu’il n’est pas accessible par l’adresse IP publique ou le nom d’hôte.

Redémarrez Apache pour appliquer les modifications:

sudo service apache2 restart

Apache est désormais accessible uniquement via l’adresse réseau privée de vos serveurs d’applications. Nous allons configurer l’équilibreur de charge pour envoyer les demandes des utilisateurs ici, dans un instant.

Télécharger et configurer l’application

Dans notre exemple, nous utilisons WordPress comme application. Si vous utilisez une autre application PHP, téléchargez-la et effectuez toute configuration appropriée (par exemple, connexion à la base de données), puis passez à la section suivante.

Sur le premier serveur d’applications, * app1 *, téléchargez l’archive WordPress:

cd ~
wget http://wordpress.org/latest.tar.gz

Extrayez l’archive WordPress:

tar xvf latest.tar.gz

Passez au répertoire extrait:

cd wordpress

WordPress a besoin d’un répertoire pour ses envois, + wp-content / uploads +. Faisons-le maintenant:

mkdir wp-content/uploads

Nous allons utiliser l’exemple de fichier de configuration WordPress comme modèle. Copiez-le au bon endroit:

cp wp-config-sample.php wp-config.php

Ouvrez maintenant le fichier de configuration pour le modifier:

vi wp-config.php

Configurez la connexion à la base de données WordPress en modifiant les informations surlignées dans les lignes suivantes:

wp-config.php

/** The name of the database for WordPress */
define('DB_NAME', '');

/** MySQL database username */
define('DB_USER', '');

/** MySQL database password */
define('DB_PASSWORD', '');

/** MySQL hostname */
define('DB_HOST', '');

Comme nous allons utiliser le cryptage TLS / SSL sur le serveur d’équilibrage de charge, nous devons ajouter les lignes suivantes pour que WordPress sache qu’il se trouve derrière un proxy inverse qui utilise SSL:

define('FORCE_SSL_ADMIN', true);
if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
      $_SERVER['HTTPS']='on';

Vous voudrez également mettre à jour les clés et les sels, afin que vous puissiez invalider les cookies quand vous le souhaitez. Nous ne couvrirons pas cela ici, mais assurez-vous qu’ils sont identiques sur tous vos serveurs d’applications.

Sauvegarder et quitter.

WordPress est maintenant configuré, mais ses fichiers doivent être copiés au bon endroit pour être servis par notre logiciel de serveur Web.

Copier les fichiers d’application dans la racine du document

Maintenant que notre application est configurée, nous devons la copier dans la racine du document d’Apache, où elle peut être servie par les visiteurs de notre site Web.

L’emplacement par défaut de Apache’s DocumentRoot est + / var / www / html +, nous l’utiliserons donc dans notre exemple.

Tout d’abord, supprimez le fichier + index.html par défaut:

sudo rm /var/www/html/index.html

Ensuite, utilisez rsync pour copier les fichiers WordPress dans + / var / www / html +, et indiquez + www-data + (l’utilisateur sous lequel Apache est exécuté):

sudo rsync -avP ~/wordpress/ /var/www/html
sudo chgrp -R www-data /var/www/html/*

Notre premier serveur d’applications, app1, est prêt. Nous allons configurer l’autre serveur d’applications.

Répliquer les fichiers d’application sur d’autres serveurs

Pour que les fichiers de votre application restent cohérents sur vos différents serveurs d’application, vous devez configurer la réplication de fichier de la racine du document de votre serveur Web. Dans le cas de WordPress, l’utilisation de l’interface Web pour télécharger des fichiers et installer des plugins stockera les fichiers sur le serveur particulier qui traite la demande. Si ces fichiers ne sont pas répliqués sur tous vos serveurs d’applications, certains de vos utilisateurs se verront attribuer des pages contenant des images manquantes et des plugins endommagés. Si votre application PHP n’est pas WordPress et ne stocke aucune de ses données (par exemple, fichiers téléchargés ou plugins téléchargés) sur le serveur d’applications, vous pouvez simplement copier les fichiers de l’application manuellement, une fois. Si tel est le cas, utilisez rsync pour copier vos fichiers d’application de * app1 * vers * app2 *.

GlusterFS peut être utilisé pour créer un volume répliqué des fichiers nécessaires, comme le montre la section * Synchroniser les fichiers d’application Web * de ce didacticiel: https://www.digitalocean.com/community/tutorials/how-to-use -haproxy-as-a-layer-4-load-balancer-for-wordpress-application-serveurs-sur-ubuntu-14-04 # synchronize-web-application-files [Comment utiliser HAProxy comme équilibreur de charge pour une application WordPress Les serveurs]. Suivez les instructions (ignorez l’emplacement d’édition du fichier d’hôtes, car votre DNS s’en charge) et configurez la réplication entre * app1 * et * app2 *.

Une fois votre réplication correctement configurée, vos deux serveurs d’applications doivent être configurés correctement. Réglons maintenant notre équilibreur de charge.

Configurer le serveur Load Balancer

Notre serveur d’équilibrage de charge exécutera HAProxy, qui servira d’équilibreur de charge de proxy inverse pour nos serveurs d’applications. Vos utilisateurs accéderont à votre application via le serveur d’équilibrage de charge via une URL telle que + https: // www.example.com +.

Cette section couvre toutes les étapes nécessaires à la configuration de notre serveur d’équilibrage de charge, mais le sujet est traité en détail dans les tutoriels suivants:

Copier le certificat SSL

Effectuez ces étapes sur le serveur d’équilibrage de charge, * lb1 *.

Dans le répertoire qui contient votre certificat SSL (l’un des prérequis de la partie 1), combinez votre certificat, tout certificat d’autorité de certification intermédiaire et la clé de votre certificat dans un seul fichier + .pem +. Par exemple (nos certificats sont dans + / root / certs +:

cd /root/certs
cat www.example.com.crt CAintermediate.ca-bundle www.example.com.key > www.example.com.pem

Copiez ensuite le fichier pem dans + / etc / ssl / private:

sudo cp www.example.com.pem /etc/ssl/private/

Ce fichier sera utilisé par HAProxy pour la résiliation SSL.

Installer HAProxy

Sur le serveur d’équilibrage de charge, * lb1 *, installez HAProxy:

sudo add-apt-repository ppa:vbernat/haproxy-1.5
sudo apt-get update
sudo apt-get -y install haproxy

Maintenant, configurons HAProxy.

Configuration HAProxy

Nous devons configurer HAProxy avec certains paramètres raisonnables, une terminaison SSL, ainsi que les interfaces et les backends appropriés, pour que cela fonctionne avec nos serveurs d’applications.

Ouvrez le fichier de configuration HAProxy pour le modifier:

sudo vi /etc/haproxy/haproxy.cfg
Configuration HAProxy: Paramètres généraux

La première chose à faire est de définir maxconn sur un nombre raisonnable. Ce paramètre affecte le nombre de connexions simultanées autorisées par HAProxy, ce qui peut avoir une incidence sur la qualité de service et empêcher vos serveurs Web de se bloquer en essayant de répondre à un trop grand nombre de demandes. Vous devrez jouer avec pour trouver ce qui fonctionne pour votre environnement. Ajoutez la ligne suivante (avec une valeur que vous jugez raisonnable) à la section globale de la configuration:

haproxy.cfg - maxconn

  maxconn

Ajoutez cette ligne pour configurer la taille maximale des clés DHE temporaires générées:

haproxy.cfg - tune.ssl.default-dh-param

  tune.ssl.default-dh-param 2048

Ensuite, dans la section des valeurs par défaut, ajoutez les lignes suivantes sous la ligne indiquant le mode http:

haproxy.cfg

  option forwardfor
  option http-server-close

Si vous souhaitez activer la page de statistiques HAProxy, ajoutez les lignes suivantes dans la section des valeurs par défaut (remplacez l’utilisateur et le mot de passe par des valeurs sécurisées):

haproxy.cfg

  stats enable
  stats uri /
  stats realm Haproxy\ Statistics
  stats auth :

Cela vous permettra de consulter la page de statistiques HAProxy en accédant à votre domaine sous / stats (par exemple, “Https://www.example.com/stats%22[https://www.example.com/stats”]).

Ne fermez pas encore le fichier de configuration! Nous ajouterons ensuite la configuration du proxy.

Configuration HAProxy: Proxies

La première chose que nous voulons ajouter est une interface pour gérer les connexions HTTP entrantes. A la fin du fichier, ajoutons une interface appelée www-http:

frontend www-http
  bind :80
  reqadd X-Forwarded-Proto:\ http
  default_backend app-backend

Le but de cette interface est d’accepter les connexions HTTP afin qu’elles puissent être redirigées vers HTTPS.

Ajoutez maintenant une interface pour gérer les connexions HTTPS entrantes. Assurez-vous de spécifier le certificat + pem + approprié:

frontend www-https
  bind :443 ssl crt /etc/ssl/private/.pem
  reqadd X-Forwarded-Proto:\ https
  default_backend app-backend

Une fois que vous avez fini de configurer les interfaces, continuez d’ajouter votre serveur en ajoutant les lignes suivantes:

backend app-backend
  redirect scheme https if !{ ssl_fc }
  server app1 :80 check
  server app2 :80 check

Ce moteur spécifie les serveurs d’applications auxquels envoyer le trafic à charge équilibrée. De plus, la ligne + redirect schéma https + `lui dit de rediriger les connexions HTTP vers HTTPS.

Maintenant, enregistrez et quittez haproxy.cfg. HAProxy est maintenant prêt à être démarré, mais commençons par activer la journalisation.

Activer la journalisation HAProxy

Ouvrez le fichier de configuration rsyslog:

sudo vi /etc/rsyslog.conf

Recherchez ensuite les lignes suivantes et décommentez-les pour activer la réception UDP syslog. Cela devrait ressembler à ce qui suit lorsque vous avez terminé:

/etc/rsyslog.conf

$ModLoad imudp
$UDPServerRun 514
$UDPServerAddress 127.0.0.1

Maintenant, redémarrez rsyslog pour activer la nouvelle configuration:

sudo service rsyslog restart

La journalisation HAProxy est maintenant activée! Le fichier journal sera créé dans + / var / log / haproxy.log + une fois que HAProxy aura démarré.

Redémarrer HAProxy

Redémarrez HAProxy pour appliquer les modifications:

sudo service haproxy restart

Notre équilibreur de charge est maintenant configuré.

Nous devons maintenant exécuter le script d’installation de l’application.

Installer WordPress

Nous devons exécuter le script d’installation WordPress, qui prépare la base de données à son utilisation, avant de pouvoir l’utiliser.

Ouvrez votre site dans un navigateur Web:

Open in a Web Browserhttps:///wp-admin/install.php

Cela affichera l’écran d’installation de WordPress. Remplissez les formulaires et cliquez sur le bouton * Installer WordPress *.

Une fois WordPress installé, l’application est prête à être utilisée.

Conclusion

Les serveurs qui composent votre application sont maintenant configurés et votre application est prête à être utilisée. Vous pouvez vous connecter en tant qu’administrateur et vos utilisateurs peuvent accéder au site via HTTPS via le nom de domaine approprié.

Assurez-vous de tester votre application et assurez-vous qu’elle fonctionne comme prévu avant de poursuivre.

Continuez avec le prochain didacticiel pour commencer à travailler sur le plan de reprise pour la configuration de votre application de production: https://www.digitalocean.com/community/tutorials/building-for-production-web-applications-recovery- planning[Building for Production: Applications Web - Planification de la récupération].