Comment configurer une pile LEPP à deux nœuds sur CentOS 7

introduction

Les applications Web à fort trafic d’aujourd’hui reposent sur des serveurs Web souples et à réponse rapide, des bases de données évolutives de classe entreprise et un contenu dynamique servi par des langages de script riches en fonctionnalités. La pile d’applications Web Linux typique suit l’architecture LAMP (Linux, Apache, MySQL et PHP / Python). Les didacticiels largement disponibles nous montrent comment installer et configurer ces composants sur un seul serveur.

C’est rarement le cas dans la vie réelle. Dans une configuration professionnelle à trois niveaux, le back-end de la base de données serait isolé sur son propre serveur; le serveur Web enverrait ses demandes à un niveau d’application faisant office de middleware entre la base de données et le site Web.

Bien qu’Apache reste de loin le serveur Web le plus utilisé, Nginx a rapidement gagné en popularité pour son faible encombrement et son temps de réponse rapide. L’édition communautaire de MySQL reste un choix populaire pour les bases de données, mais de nombreux sites utilisent également une autre plate-forme de base de données open source appelée PostgreSQL.

Buts

Dans ce tutoriel, nous allons créer une application Web simple dans une architecture à deux niveaux. Notre système d’exploitation de base pour les deux nœuds sera CentOS 7. Le site sera alimenté par un serveur Web Nginx exécutant du code PHP communiquant avec une base de données PostgreSQL.

Au lieu d’adopter une approche «descendante» décrite dans d’autres didacticiels LAMP ou LEMP, nous utiliserons une approche «simplifiée»: nous créerons d’abord un niveau base de données, puis le serveur Web, puis verrons comment le serveur Web peut se connecter. à la base de données.

Nous appellerons cette configuration une pile LEPP (Linux, Nginx, PHP, PostgreSQL).

Conditions préalables

Pour suivre ce tutoriel, vous aurez besoin des éléments suivants:

  • Deux droplets CentOS 7 avec au moins 2 Go de RAM et 2 cœurs de processeur, un pour le serveur de base de données et un serveur Web.

Nous nous référerons aux adresses IP de ces machines en tant que ` et `; vous pouvez trouver les adresses IP réelles de ces machines sur le panneau de commande de DigitalOcean.

  • Utilisateurs non root de Sudo sur les deux gouttelettes. Pour configurer cela, suivez cet tutoriel.

Première étape - Installer PostgreSQL

Dans cette étape, nous allons installer PostgreSQL sur le serveur de base de données.

Connectez-vous à la zone CentOS 7 vide et fraîchement installée où vous souhaitez installer PostgreSQL. Son référentiel ne vient pas par défaut avec CentOS 7, nous devrons donc d’abord télécharger le RPM du référentiel yum.

sudo wget http://yum.postgresql.org/9.4/redhat/rhel-7Server-x86_64/pgdg-centos94-9.4-1.noarch.rpm

Une fois le RPM enregistré, installez le référentiel.

sudo yum install pgdg-centos94-9.4-1.noarch.rpm -y

Enfin, installez le serveur PostgreSQL 9.4 et ses modules contrib.

sudo yum install postgresql94-server postgresql94-contrib -y

Deuxième étape - Configuration de PostgreSQL

Dans cette étape, nous allons personnaliser un certain nombre de configurations de post-installation pour PostgreSQL.

Dans CentOS 7, l’emplacement par défaut des fichiers de configuration et des données PostgreSQL 9.4 est + / var / lib / pgsql / 9.4 / data / + et l’emplacement des fichiers binaires du programme est + / usr / pgsql-9.4 / bin / +. . Le répertoire de données est vide au début. Nous devrons exécuter le programme + initdb + pour initialiser le cluster de base de données et y créer les fichiers nécessaires:

sudo /usr/pgsql-9.4/bin/postgresql94-setup initdb

Une fois le cluster de base de données initialisé, il y aura un fichier nommé + postgresql.conf + dans le dossier de données, qui est le fichier de configuration principal de PostgreSQL. Nous allons changer deux paramètres dans ce fichier. En utilisant + vi + ou votre éditeur de texte favori, ouvrez le fichier pour l’éditer.

sudo vi /var/lib/pgsql/9.4/data/postgresql.conf

Et changez les lignes suivantes:

  • Remplacez + listen_addresses = '' + par '+ listen_addresses =' * '+ `

  • Changez + port = 5432 + en + + port = 5432 +

Le premier paramètre spécifie l’adresse IP que le serveur de base de données écoutera. Par mesure de sécurité, les installations Postgres prêtes à l’emploi n’autorisent que les connexions à l’hôte local. Si vous changez cette valeur en "*", Postgres écoutera le trafic provenant de n’importe quelle source. Le deuxième paramètre a été activé en supprimant le marqueur de commentaire (#); il spécifie le port par défaut pour Postgres.

Enregistrez et quittez le fichier.

Ensuite, nous allons éditer + pg_hba.conf +, qui est le fichier de configuration de HBA (Host Based Access) de PostgreSQL. Il spécifie quels hôtes et plages IP peuvent se connecter au serveur de base de données. Chaque entrée spécifie si la connexion peut être établie localement ou à distance (hôte), à ​​quelle base de données elle peut se connecter, à quel utilisateur elle peut se connecter, à quelle adresse IP la requête peut provenir et quel mode d’authentification doit être utilisé. Toute demande de connexion ne correspondant à aucune de ces entrées serait refusée.

Ouvrez + pg_hba.conf pour le modifier.

sudo vi /var/lib/pgsql/9.4/data/pg_hba.conf

Faites défiler jusqu’au bas du fichier et ajoutez cette ligne:

host        all             all             /32          md5

Cette ligne indique à PostgreSQL d’accepter les connexions à la base de données provenant uniquement de l’adresse IP ++ en utilisant une somme de contrôle md5 standard pour l’authentification par mot de passe. La connexion peut être faite sur n’importe quelle base de données en tant que n’importe quel utilisateur.

Enregistrez et quittez le fichier.

Ensuite, démarrez le service Postgres:

sudo systemctl start postgresql-9.4.service

Et puis l’activer:

sudo systemctl enable postgresql-9.4.service

Pour vérifier si le serveur de base de données accepte les connexions, nous pouvons examiner les dernières lignes du dernier fichier journal Postgres. Les journaux d’erreur de base de données sont enregistrés dans le répertoire + / var / lib / pgsql / 9.4 / data / pg_log +. Exécutez la commande suivante pour voir les fichiers dans ce répertoire.

sudo ls -l /var/lib/pgsql/9.4/data/pg_log

Les noms de fichier journal ont le modèle + postgresql-.log + (par exemple, + postgresql-Wed.log +). Recherchez le fichier journal correspondant au jour actuel et consultez les dernières lignes du dernier fichier journal.

sudo tail -f -n 20 /var/lib/pgsql/9.4/data/pg_log/postgresql-.log

La sortie devrait montrer quelque chose de similaire à ceci:

...

< 2015-02-26 21:32:24.159 EST >LOG:  database system is ready to accept connections
< 2015-02-26 21:32:24.159 EST >LOG:  autovacuum launcher started

Appuyez sur * CTRL + C * pour arrêter la sortie de la commande + tail +.

Troisième étape - Mise à jour du pare-feu du serveur de bases de données

Nous devons également permettre au trafic de la base de données Postgres de traverser le pare-feu. CentOS 7 implémente un pare-feu dynamique via le démon + firewalld +; le service n’a pas besoin de redémarrer pour que les modifications prennent effet. Le service + firewalld + devrait démarrer automatiquement au démarrage du système, mais il est toujours bon de le vérifier.

sudo firewall-cmd --state

L’état par défaut devrait être + running +, mais s’il est + not running +, démarrez-le avec:

sudo systemctl start firewalld

Ensuite, ajoutez les règles pour le port 5432. C’est le port pour le trafic de base de données PostgreSQL.

sudo firewall-cmd --permanent --zone=public --add-port=5432/tcp

Rechargez ensuite le pare-feu.

sudo firewall-cmd --reload

Quatrième étape - Créer et remplir la base de données

Dans cette étape, nous allons créer une base de données et y ajouter des données. Ce sont les données que notre application Web va récupérer et afficher de manière dynamique.

La première étape consiste à changer le mot de passe du superutilisateur Postgres, appelé * postgres *, créé lors de la première installation de PostgreSQL. Il est préférable que le mot de passe de l’utilisateur soit modifié depuis Postgres plutôt que par l’invite du système d’exploitation. Pour ce faire, basculez vers l’utilisateur * postgres *:

sudo su - postgres

Cela modifiera l’invite de commande en + -bash-4.2 $ +. Ensuite, démarrez l’outil client intégré.

psql

Par défaut, l’utilisateur postgres sera enregistré dans la base de données Postgres. Votre invite deviendra + postgres = # +, l’invite psql, pas une invite du système d’exploitation. Si vous lancez la commande + \ password + maintenant, des invites vous demanderont de changer le mot de passe.

\password

Fournissez un mot de passe sécurisé pour l’utilisateur Postgres.

Ensuite, créez une base de données appelée * product *:

CREATE DATABASE product;

Puis connectez-vous à la base de données * product *:

\connect product;

Ensuite, créez une table dans la base de données appelée * product_list *:

CREATE TABLE product_list (id int, product_name varchar(50));

Exécutez chacune des commandes suivantes une à la fois. Chaque commande ajoutera un seul enregistrement à la table + product_list +.

INSERT INTO product_list VALUES (1, 'Book');
INSERT INTO product_list VALUES (2, 'Computer');
INSERT INTO product_list VALUES (3, 'Desk');

Enfin, vérifiez que les données ont été ajoutées correctement.

SELECT * FROM product_list;

Le résultat devrait ressembler à ceci:

id | product_name
----+--------------
 1 | Book
 2 | Computer
 3 | Desk
(3 rows)

C’est tout ce que nous devons faire sur le serveur de base de données; vous pouvez maintenant vous déconnecter.

Cinquième étape - Installation de Nginx

Ensuite, nous allons installer et configurer un serveur Web Nginx dans l’autre Droplet. Connectez-vous à l’autre boîte CentOS 7 vide et fraîchement installée.

Comme PosgreSQL, le référentiel Nginx n’est pas fourni avec CentOS 7 par défaut. Nous devrons d’abord télécharger le RPM du référentiel yum.

sudo wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

Une fois le RPM enregistré, installez le référentiel.

sudo yum install nginx-release-centos-7-0.el7.ngx.noarch.rpm -y

Enfin, installez le serveur Web Nginx.

sudo yum install nginx -y

Sixième étape - Mise à jour du pare-feu du serveur Web

Dans cette étape, nous allons configurer le pare-feu pour autoriser le trafic Nginx et personnaliser certaines configurations Nginx.

Nous devons autoriser le trafic HTTP / HTTPS à traverser le pare-feu. Comme auparavant, vérifiez que le service + firewalld + est en cours d’exécution.

sudo firewall-cmd --state

L’état par défaut devrait être + running +, mais si c’est + ne pas lancer +, démarrez-le:

sudo systemctl start firewalld

Ajoutez maintenant la règle de pare-feu pour le port 80 (HTTP):

sudo firewall-cmd --permanent --zone=public --add-port=80/tcp

Ajoutez un autre pour le port 443 (HTTPS):

sudo firewall-cmd --permanent --zone=public --add-port=443/tcp

Rechargez ensuite le pare-feu.

sudo firewall-cmd --reload

Ensuite, démarrez Nginx.

sudo systemctl start nginx.service

Et l’activer.

sudo systemctl enable nginx.service

En pointant notre navigateur sur l’adresse IP du serveur devrait nous montrer la page web par défaut:

image: https: //assets.digitalocean.com/articles/LEPP_CentOS7/1.jpg [Page Web par défaut servie par Nginx]

Étape 7 - Configuration de Nginx

Deux fichiers de configuration Nginx sont pertinents pour cette étape. Le premier est le fichier de configuration principal et le second est un fichier spécifique au site.

Le fichier de configuration générale contrôle les caractéristiques générales du serveur. Nginx peut desservir de nombreux sites Web et chaque site est appelé un bloc serveur (Apache les appelle hôtes virtuels ou hôtes virtuels). La configuration de chaque site est contrôlée par un fichier de configuration de bloc de serveur.

Modifions le fichier de configuration du serveur principal.

sudo vi /etc/nginx/nginx.conf

Sur la deuxième ligne du fichier, modifiez le paramètre + worker_processes + de 1 à 2. Cela indique aux threads de travail de Nginx d’utiliser tous les cœurs de processeur disponibles. Enregistrez et quittez le fichier.

Nous ne créerons pas de blocs de service ici. Au lieu de cela, nous allons créer notre application Web dans le bloc serveur par défaut. Modifions donc le fichier de configuration du bloc serveur par défaut.

sudo vi /etc/nginx/conf.d/default.conf

Le contenu ressemble à ceci. Les pièces que vous allez éditer sont mises en surbrillance.

server {
   listen       80;
   server_name  ;

   ...


       root   /usr/share/nginx/html;
       ;


   #error_page  404              /404.html;

   ...

   # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
   #
   location ~ \.php$ {

       fastcgi_pass
       fastcgi_index        index.php;
       fastcgi_param        SCRIPT_FILENAME $fastcgi_script_name;
       include              fastcgi_params;
   }

...
}

Apportez les modifications suivantes:

  • Définissez + nom_serveur + de + localhost + à ++.

  • Ajoutez + index.php à la directive` + index + pour qu’il lise + index.php index.html index.htm`.

  • Supprimez les lignes + location / {+ et +} + contenant les directives + root et` + index`. Sans cette modification, il est possible que votre page Web ne s’affiche pas dans le navigateur et que le journal des erreurs de Nginx enregistre des messages tels que `" Impossible d'ouvrir le script principal: /etc/nginx/html/index.php (Aucun fichier ou répertoire de ce type) " `

  • Décommentez le bloc + location ~ \ .php $ + (y compris le dernier accolade) situé sous le * passage des scripts PHP au commentaire * du serveur FastCGI.

  • Supprimez la directive racine sous le même bloc + location ~ \ .php $ +.

  • Modifiez la valeur de la directive fastcgi_pass de +127.0.0.1: 9000 + en + unix: / var / run / php-fpm / php5-fpm.sock +. Cela permet de s’assurer que le gestionnaire de processus FastCGI de PHP (que nous installerons à la prochaine étape) écoutera le socket Unix.

  • Remplacez la valeur de la directive + fastcgi_param + par `+ SCRIPT_FILENAME $ racine_documentation $ fastcgi_nom_script + '. Cela indique au serveur Web que les fichiers de script PHP seront enregistrés dans le répertoire racine du document.

Une fois la modification terminée, le fichier devrait ressembler à ceci:

server {
   listen       80;
   server_name  ;

   ...

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

   ...

   # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
   #
   location ~ \.php$ {
       fastcgi_pass
       fastcgi_index  index.php;
       fastcgi_param  SCRIPT_FILENAME $fastcgi_script_name;
       include        fastcgi_params;
   }

   ...

Enregistrez et quittez le fichier, puis démarrez le serveur Web.

sudo systemctl restart nginx.service

Huitième étape - Installer PHP

Nous allons maintenant installer trois composants de PHP sur le serveur Web: le moteur PHP lui-même, le gestionnaire de processus FastCGI (FPM) et le module PHP pour PostgreSQL.

Tout d’abord, installez PHP.

sudo yum install php -y

Nous allons ensuite installer le gestionnaire de processus FastCGI (FPM), qui est la propre implémentation de FastCGI par PHP. FastCGI est comme un add-on au-dessus de votre serveur Web. Il fonctionne indépendamment et aide à accélérer les demandes des utilisateurs en les consolidant en un seul processus, accélérant ainsi le temps de réponse.

sudo yum install php-fpm -y

Enfin, installez le module PHP Postgres:

sudo yum install php-pgsql -y

Étape neuf - Configuration de PHP

Dans cette étape, nous allons configurer PHP.

Ouvrez le fichier de configuration PHP.

sudo vi /etc/php.ini

Apportez les modifications suivantes:

  • Changez + expose_php = On + en + + expose_php = Off +. Définir ce paramètre sur + Off + signifie simplement que PHP n’ajoute pas sa signature à l’en-tête du serveur Web et n’expose pas le fait que le serveur exécute PHP.

  • Remplacez +; cgi.fix_pathinfo = 0 + par +; cgi.fix_pathinfo = 1 +.

Enregistrez et quittez le fichier. Ensuite, éditez le fichier de configuration FPM.

sudo vi /etc/php-fpm.d/www.conf

Apportez les modifications suivantes:

  • Changez + user = apache en` + user = nginx`.

  • De même, remplacez + group = apache par` + group = nginx`.

  • Changez + listen = 127.0.0.1: 9000 + en + listen = / var / run / php-fpm / php5-fpm.sock +. Nous définissons cette même valeur dans le fichier de configuration du bloc serveur par défaut de Nginx.

Sauvegarder et quitter vi. Ensuite, démarrez PHP-FPM.

sudo systemctl start php-fpm.service

Puis activez-le.

sudo systemctl enable php-fpm.service

Dixième étape - Création de l’application Web

Tous nos composants de serveur sont prêts dans les deux nœuds. Il est maintenant temps de créer notre application PHP. Créez un fichier nommé + index.php dans` + / usr / share / nginx / html`.

sudo vi /usr/share/nginx/html/index.php

Coller dans le contenu suivant. Assurez-vous de remplacer les variables en surbrillance par l’adresse IP de votre serveur de base de données et le mot de passe Postgres, respectivement.

<html>

<head>
   <title>LEPP Stack Example</title>
</head>

<body>

<h4>LEPP (Linux, Nginx, PHP, PostgreSQL) Sample Page</h4>
<hr/>
<p>Hello and welcome. This web page is dynamically showing a product list from a PostgreSQL database</p>

<?php

   $host = "";
   $user = "postgres";
   $password = "";
   $dbname = "product";

   $con = pg_connect("host=$host dbname=$dbname user=$user password=$password")
           or die ("Could not connect to server\n");

   $query = "SELECT * FROM product_list";
   $resultset = pg_query($con, $query) or die("Cannot execute query: $query\n");
   $rowcount = pg_numrows($resultset);

   for($index = 0; $index < $rowcount; $index++) {
           $row = pg_fetch_array($resultset, $index);
           echo $row["id"], "-", $row["product_name"];
           echo "<br>";
   }
?>

</body>
</html>

C’est une simple page Web avec du code PHP incorporé. Premièrement, il définit un certain nombre de paramètres pour la chaîne de connexion à la base de données. Ensuite, une connexion (spécifiée par + $ con +) est établie sur le serveur de base de données. Une requête est spécifiée et elle est ensuite exécutée sur la table * product_list *. Il parcourt les résultats renvoyés et imprime le contenu de chaque ligne dans une nouvelle ligne.

Une fois le fichier écrit et enregistré, ouvrez une fenêtre de navigateur et pointez-la sur ++. Le contenu devrait ressembler à ceci:

image: http: //i.imgur.com/HDwygcq.jpg [Page Web dynamique PHP contenant des données PostgreSQL]

Conclusion

Nous avons construit deux boîtes à partir de zéro, installé et configuré tous les logiciels nécessaires, puis déployé notre application Web dans celle-ci. Une pile de production présenterait une complexité supplémentaire, par exemple l’ajout de pare-feu externes et d’équilibreurs de charge, mais il s’agit d’une configuration de base solide que vous pouvez utiliser pour commencer. Prendre plaisir!