Installation d’un serveur web ecommerce.fr sur une machine unique
Installation des services
Installation des paquets :
dnf install nginx php-fpm mariadb-server php-mysqlnd
Configuration d’nginx
- Lancement et démarrage automatique du service nginx :
systemctl enable --now nginx
- Autorisation du protocole http dans firewall-cmd :
firewall-cmd --permanent --add-service=http && firewall-cmd --reload
- Test de connexion sur l’IP de la machine :
Configuration de mariadb
- Lancement et démarrage automatique du service mariadb :
systemctl enable --now mariadb
- ““Sécurisation”” du serveur mariadb
mysql_secure_installation
Switch to unix_socket authentication [Y/n]
Change the root password? [Y/n] n
Remove anonymous users? [Y/n]
Disallow root login remotely? [Y/n]
Remove test database and access to it? [Y/n]
Reload privilege tables now? [Y/n]
- Création d’une base de données et d’un utilisateur :
mysql -u root -p
create database mabdd;
CREATE USER 'hi'@'localhost' IDENTIFIED BY 'motdepasse';
GRANT ALL PRIVILEGES ON mabdd.* TO 'hi'@'localhost';
FLUSH PRIVILEGES;
exit
- Déploiement du site ecommerce.fr
Créer le dossier pour le site :
mkdir -p /var/www/ecommerce.fr/
Copier le contenu du site depuis un appareil externe vers le serveur :
scp -r ecommerce.fr/* root@192.168.197.55:/var/www/ecommerce.fr
Ouvrir le fichier /etc/php-fpm.d/www.conf et remplacer les valeurs user = apache et group = apache par user = nginx et group = nginx
Démarrer le service php-fpm :
systemctl enable --now php-fpm
Créer un fichier de configuration appelé ecommerce.fr.conf pour le site dans /etc/nginx/conf.d :
server {
listen 80;
listen [::]:80;
root /var/www/ecommerce.fr/;
index index.html index.htm index.nginx-debian.html sign-up.php;
server_name ecommerce.fr;
location ~* \.php$ {
fastcgi_pass unix:/run/php-fpm/www.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
access_log /var/log/nginx/access_ecommerce.fr.log;
error_log /var/log/nginx/error_ecommerce.fr.log;
location / {
try_files $uri $uri/ =404;
}
}
Appliquer les bonnes permissions sur ecommerce.fr :
find /var/www/ecommerce.fr/ -type d -exec chmod 755 {} \;
find /var/www/ecommerce.fr/ -type f -exec chmod 644 {} \;
chown -R nginx:nginx /var/www/ecommerce.fr/
Modifier le fichier conf.php présent dans /var/www/ecommerce.fr pour renseigner les identifiants de la base SQL :
<?php
$SETTINGS["mysql_user"]='hi';
$SETTINGS["mysql_pass"]='motdepasse';
$SETTINGS["hostname"]='localhost';
$SETTINGS["mysql_database"]='mabdd';
$SETTINGS["data_table"]='registrations';
$SETTINGS["paypal_address"]='email@domain.com';
?>
Exécuter le script SQL database.sql présent dans /var/www/ecommerce.fr :
mysql -u hi -p
use mabdd
source /var/www/ecommerce.fr/database.sql
exit
systemctl restart nginx
Modification du fichier /etc/hosts de mon PC portable pour pointer vers ecommerce.fr :
sudo su -
echo "192.168.2.55 ecommerce.fr" > /etc/hosts
Test de connexion sur ecommerce.fr :
Pour vérifier que php est fonctionnel :
echo '<?php phpinfo(); ?>' > /var/www/ecommerce.fr/info.php
Se rendre sur ecommerce.fr/info.php
Installation d’un serveur web ecommerce.uk sur une machine unique
Répéter les opérations précédentes
- Création d’une nouvelle base de données et d’un nouvel utilisateur :
mysql -u root -p
create database mydb;
CREATE USER 'hello'@'localhost' IDENTIFIED BY 'motdepasse';
GRANT ALL PRIVILEGES ON mydb.* TO 'hello'@'localhost';
FLUSH PRIVILEGES;
exit
- Copie du dossier et de la configuration d’ecommerce.fr vers ecommerce.uk
cp -r /var/www/ecommerce.fr/ /var/www/ecommerce.uk
cp /etc/nginx/conf.d/ecommerce.fr.conf /etc/nginx/conf.d/ecommerce.uk.conf
- Remplacer toutes les itérations d’ecommerce.fr vers ecommerce.uk
sed -i 's/ecommerce.fr/ecommerce.uk/g' /etc/nginx/conf.d/ecommerce.uk.conf
- Rajouter l’entrée d’ecommerce.uk dans le fichier host de l’utilisateur
sudo su -
echo "192.168.2.55 ecommerce.uk" > /etc/hosts
- Redémarrer nginx et tester
- Checking des logs
[root@srv-web-01 ~]# ls -lrt /var/log/nginx
total 20
-rw-r--r--. 1 root root 0 Jan 20 11:09 error.log
-rw-r--r--. 1 root root 0 Jan 20 11:09 access.log
-rw-r--r--. 1 root root 4191 Jan 20 11:35 error_ecommerce.fr.log
-rw-r--r--. 1 root root 0 Feb 3 08:45 error_ecommerce.uk.log
-rw-r--r--. 1 root root 1846 Feb 3 08:50 access_ecommerce.uk.log
-rw-r--r--. 1 root root 6438 Feb 3 08:50 access_ecommerce.fr.log
Restriction accès IP
- Création d’une blocklist et ajout de son addresse IP
echo "deny 192.168.2.92;" > /etc/nginx/blockip.conf
- Ajout de la blocking list sur ecommerce.fr
- Ouvrir le fichier /etc/nginx/conf.d/ecommerce.fr.conf
- Ajouter le bloc
include blockip.conf;
au dessus deserver_name
- Recharger nginx
Analyse des logs
- Installer goaccess pour une interface plus claire
dnf install epel-release -y
dnf install goaccess -y
- Charger les logs de connexion
goaccess -f /var/log/nginx/access_ecommerce.fr.log
Choisissez le format des logs et appuyez sur Entrée.
Vous pouvez maintenant naviguer simplement dans les logs d’accès de votre site web.
Ajout d’un certificat TLS
Création d’un dossier dédié à nos certificats et modification des permissions
mkdir /etc/ssl/private
chmod 700 /etc/ssl/private
Création du certificat TLS
Req : La commande x509 est un utilitaire de certificat polyvalent. Il peut être utilisé pour afficher des informations de certificat, convertir des certificats en diverses formes, signer des demandes de certificat comme une «mini CA» ou modifier les paramètres de confiance de certificat.
-x509 : Cette option génère un certificat auto-signé au lieu d’une demande de certificat. Ceci est généralement utilisé pour générer un certificat de test ou une autorité de certification racine auto-signée. Les extensions ajoutées au certificat (le cas échéant) sont spécifiées dans le fichier de configuration.
-nodes : Cela indique à OpenSSL d’ignorer l’option permettant de sécuriser notre certificat avec une passphrase. Nous avons besoin de Nginx pour pouvoir lire le fichier, sans intervention de l’utilisateur, au démarrage du serveur. Une phrase secrète empêcherait que cela se produise car nous devions la saisir après chaque redémarrage.
-days 365 : durée de validité du certificat
-newkey rsa:2048 : Cela spécifie que nous voulons générer un nouveau certificat et une nouvelle clé en même temps. Nous n’avons pas créé la clé requise pour signer le certificat lors d’une étape précédente, nous devons donc la créer avec le certificat. La partie rsa: 2048 lui indique de créer une clé RSA d’une longueur de 2048 bits.
-keyout /etc/ssl/private/nginx-selfsigned.key
-out /etc/ssl/certs/nginx-selfsigned.crt
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crt
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:FR
State or Province Name (full name) []:Hauts-de-France
Locality Name (eg, city) [Default City]:Lille
Organization Name (eg, company) [Default Company Ltd]:Basile Industries
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) []:srv-web-01
Email Address []:basile@ribour.org
Création d’un groupe Diffie-Hellman fort pour la négotiation de PFS
openssl dhparam -out /etc/ssl/private/dhparam.pem 2048
Ajout du protocole https sur les sites ecommerce
- Rajouter ce bloc sur /etc/nginx/conf.d/ecommerce.fr.conf
server {
listen 443 http2 ssl;
listen [::]:443 http2 ssl;
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
ssl_dhparam /etc/ssl/private/dhparam.pem;
root /var/www/ecommerce.fr/;
index index.html index.htm index.nginx-debian.html sign-up.php;
server_name ecommerce.fr;
location ~* \.php$ {
fastcgi_pass unix:/run/php-fpm/www.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
access_log /var/log/nginx/access_ecommerce.fr.log;
error_log /var/log/nginx/error_ecommerce.fr.log;
location / {
try_files $uri $uri/ =404;
}
}
- Autoriser le port https sur le firewall
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --reload
- Redémarrage du service nginx et vérification
Chrome nous prévient que le certificat généré ne provient pas d’une authorité présente dans le navigateur. Nous pouvons continuer tout de même.
Nous pouvons voir les détails émanant de ce certificat via l’onglet “Détails du certificat”.
Redirection HTTP → HTTPS
Ajouter le module suivant en dessous de server_name ecommerce.fr;
dans le fichier de configuration /etc/nginx/conf.d/ecommerce.fr.conf
return 301 https://$host$request_uri/;
Faire de même pour le fichier /etc/nginx/conf.d/ecommerce.uk.conf
Configurer un serveur B à accéder à la BDD d’un serveur A
- Ouvrir le port 3306/tcp sur le serveur A
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
- Autoriser les connexions extérieures à la BDD du serveur A
Ouvrir le fichier /etc/my.cnf.d/mariadb-server.cnf et décommenter la ligne bind-adress=0.0.0.0
⚠️ Cela aura pour effet d’accepter la connexion à la BDD sur toutes les interfaces du serveur
- Création/Modification d’un compte pour autoriser le serveur B à se connecter à une BDD du serveur A
MariaDB [(none)]> GRANT ALL on mabdd.* to 'hi'@'192.168.43.205' IDENTIFIED BY 'motdepasse';
MariaDB [(none)]> FLUSH PRIVILEGES;
Ajout de la Haute Disponibilité (HA)
Installer HAProxy sur srv-haproxy-01
dnf install haproxy -y
Configuration d’HAProxy
- Création d’une copie du fichier de configuration
mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
- Ajout de notre configuration HAProxy dans le fichier haproxy.cfg
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
#---------------------------------------------------------------------
# Default settings
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
#---------------------------------------------------------------------
# Stats configuration
#---------------------------------------------------------------------
listen stats
bind *:8080 # son port
stats enable
stats hide-version
stats uri /stats # l’url
stats admin if LOCALHOST
stats auth haproxy:haproxy # login/mdp de l’interface
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend main
bind *:80 # sur le port de votre serveur HAproxy
acl url_static path_beg -i /static /images /javascript /stylesheets
acl url_static path_end -i .jpg .gif .png .css .js
# use_backend static if url_static
default_backend app # nom de votre backend
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
balance roundrobin
server web01 192.168.43.55:443 ssl verify none check
server web02 192.168.43.205:443 ssl verify none check
- Activer rsyslog
Décommenter les lignes suivantes dans /etc/rsyslog.conf
module(load="imudp") # needs to be done just once
input(type="imudp" port="514")
- Autoriser HAProxy à se connecter aux services sur SELinux et démarrer les services
setsebool -P haproxy_connect_any 1
systemctl enable --now haproxy
systemctl enable --now rsyslog
- Connexion à la page de statistiques HAProxy
Se rendre dans son navigateur et taper l’IP de votre serveur HAProxy suivi de :8080/stats
. Ici, j’ai dû renseigner http://192.168.43.39:8080/stats
Sécurisation de notre serveur HAProxy
Nous allons générer un certificat autosigné pour HAProxy.
- Générer le cert valide 1 an
cd /etc/pki/tls/certs
openssl req -x509 -nodes -newkey rsa:2048 -keyout /etc/pki/tls/certs/haproxy.pem -out /etc/pki/tls/certs/haproxy.pem -days 365
- Modifier le fichier de configuration HAProxy
Rajouter les lignes suivantes dans global
maxsslconn 256
tune.ssl.default-dh-param 2048
Rajouter la ligne suivante dans frontend main
bind *:443 ssl crt /etc/pki/tls/certs/haproxy.pem
- Redémarrer le service et vérifier le certificat utilisé
systemctl restart haproxy
Installation et configuration d’un cluster HAProxy
Installation du deuxième serveur HAProxy
Réinstallez une nouvelle VM et répliquez la configuration initiale du premier HAProxy.
Ajout de la résolution des noms sur les serveurs
Ouvrez le fichier /etc/hosts sur chaque machines et ajoutez les entrées suivantes :
192.168.43.55 srv-web-01
192.168.43.205 srv-web-02
192.168.43.39 srv-haproxy-01
192.168.43.123 srv-haproxy-02
Installation et configuration de pacemaker sur les deux serveurs HAProxy
- Ajout du repository High Availability
dnf config-manager --set-enabled highavailability
- Installation du service Pacemaker et de l’outil pcs
dnf install pacemaker pcs
- Ajout du démon pcsd au démarrage de la machine
systemctl enable --now pcsd
- Création d’un mot de passe pour le compte hacluster
passwd hacluster
- Ouverture du port 2224/tcp pour pacemaker
firewall-cmd --permanent --add-service=high-availability
firewall-cmd --reload
- Ajout de l’authentication entre nos deux nodes
pcs host auth srv-haproxy-01 srv-haproxy-02
- Déploiement du cluster
⚠️ À partir de maintenant, faire les manipulations uniquement sur le node01 ⚠️
pcs cluster setup ha_cluster srv-haproxy-01 srv-haproxy-02
- Démarrage et activation du cluster
pcs cluster start --all
pcs cluster enable --all
- Vérification de l’état du cluster et des noeuds
pcs cluster status
pcs status corosync
pcs status cluster
pcs status nodes
- Désactivation de STONITH
pcs property set stonith-enabled=false
pcs property set no-quorum-policy=ignore
- Création d’une VIP
pcs resource create virtual_ip ocf:heartbeat:IPaddr2 ip=192.168.43.100 cidr_netmask=24 op monitor interval=30s
- Installation de la ressource haproxy pour heartbeat
⚠️ Vous devez ici réaliser la manipulation sur les deux serveurs ⚠️
cd /usr/lib/ocf/resource.d/heartbeat/
curl -O https://raw.githubusercontent.com/thisismitch/cluster-agents/master/haproxy
chmod +x haproxy
- Création de notre cluster de ressource maintenance
⚠️ À réaliser de nouveau sur le node01 uniquement ⚠️
pcs resource create haproxy ocf:heartbeat:haproxy binpath=/usr/sbin/haproxy conffile=/etc/haproxy/haproxy.cfg op monitor interval=10s
- Affectation de notre ressource HAproxyGroup à notre cluster
pcs resource group add HAproxyGroup virtual_ip haproxy
pcs constraint order virtual_ip then haproxy
NDT : La commande pcs constraint n’a pas fonctionné chez moi
- Vérification du fonctionnement de la VIP