vpswordpressinfogestion
Installer WordPress et WooCommerce sur un VPS
Conrad Lelubre, le 1 juillet 2019

Ce guide est interactif

Ce guide est interactif ! Les encadrés en bleu (comme celui-ci) contiennent des champs vous permettant de personnaliser les commandes contenues dans le guide.






Les données sont sauvegardées localement sur votre navigateur, de manière à ce que vous les retrouviez plus tard. Aucune donnée n'est envoyée sur mes serveurs.
Mettre en place un VPS (serveur privé virtuel) pour héberger du WordPress, c'est une excellente solution pour avoir un site ultra-performant.
Mais c'est pas franchement facile quand on ne s'y connaît pas !
J'espère qu'avec ce guide, n'importe qui de débrouillard sera capable de se lancer dans l'aventure.

0. Commander un VPS

Pour être franc, je n'ai pas testé un milliard de fournisseurs de VPS. OVH m'a toujours apporté satisfaction. Leurs tarifs et performances sont à mon goût.
Pour 3,60 € par mois, on se retrouve avec 20 Go de SSD, 1 vCore, 100 Mbits/s et un trafic "illimité" ( après lecture des conditions particulières des VPS, ils sont en réalité limités à 10 To de trafic, puis le débit descend à 1 Mbits/s; c’est bon à savoir).
La première étape, c'est donc de commander un VPS. Vous pouvez retrouver l'offre d'OVH en suivant ce lien : offre de VPS chez OVH.
Il faudra ensuite choisir le système d'exploitation pendant la configuration du VPS. Si vous suivez ce guide, vous avez tout intérêt à prendre Debian 9 (Stretch). C'est une distribution Linux stable qui a fait ses preuves depuis fort longtemps.
Une fois votre VPS commandé, votre fournisseur devrait vous fournir son adresse IPV4 (du type 255.255.255.255). Vous aurez besoin de cette information pour vous connecter à la machine avec un terminal et pour configurer votre nom de domaine.
Pour vous faciliter la vie, entrez l'IP de votre VPS ici : cela customisera tout le reste du guide !

1. Se connecter à son VPS en root (administrateur)

Connectez-vous sur votre tout nouveau VPS grâce à SSH. Vous êtes sous Windows ? Installez Git for Windows <3 ;).
Le mot de passe root vous a probablement été envoyé par email.~$ ssh root@IP-DU-VPS
Copier
Il se peut que votre système demande à confirmer l'authenticité de la machine. Répondez "yes" !

2. Créer un utilisateur avec moins de droit

C'est une pratique nécessaire pour éviter d'exécuter des commandes avec trop de permissions. Cela permettra d'éviter qu'un processus que vous avez lancé avec cet utilisateur ne puisse être utilisé comme cheval de troie pour prendre le contrôle de la machine. Donc on laisse tomber le gentil root et on bascule sur un utilisateur plus restreint.
Entrez ici le nom d'utilisateur que vous souhaitez utiliser sur votre machine. De cette manière, la suite du guide sera configurée pour vous !
On va désormais créer l'utilisateur :~$ adduser UTILISATEUR-NON-ROOT
Copier
Choisissez un mot de passe sécurisé et notez-le précieusement.
Il faut ensuite donner les droits "sudo" à l'utilisateur, pour lui permettre d'exécuter des commandes avec les droits d'administrateur :~$ usermod -aG sudo UTILISATEUR-NON-ROOT
Copier

3. Se connecter à son VPS avec UTILISATEUR-NON-ROOT

Pour commencer, déconnectez-vous de la session root :~$ exit
Copier
Puis connectez-vous avec l'utilisateur :~$ ssh UTILISATEUR-NON-ROOT@IP-DU-VPS
Copier
Entrez le mot de passe précédemment choisi.
C'est bon, vous êtes connecté !
Pour ce guide on va rester connecté de cette manière, mais sachez qu'il est préférable de passer par une connexion sécurisée par clé SSH. Si vous le souhaitez vous pouvez suivre ce guide pour créer une clé SSH. Pensez à toujours utiliser une clé SSH avec mot de passe pour la protéger en cas de faille dans votre système. Une fois votre clé SSH générée, ajoutez la clé publique sur le serveur en utilisant la commande suivante (depuis votre machine, pas depuis le serveur !) :~$ ssh-copy-id UTILISATEUR-NON-ROOT@IP-DU-VPS
Copier

4. Configurer la zone DNS de votre nom de domaine

Entrez ici le nom de domaine du site que vous souhaitez héberger sur votre VPS sans le protocole (ne pas écrire http://) (ex: cxyz.fr) :
Vous devez vous rendre dans la configuration de la zone DNS de DOMAINE-DU-SITE.COM et modifier le champ A pour le faire pointer vers IP-DU-VPS. Attention, cette opération va entraîner une coupure de service si le site existe déjà. Il faut adopter une stratégie plus douce pour réaliser une transition en douceur si c'est le cas.
Si vous êtes chez OVH, la documentation est par ici.
Une fois que vous avez édité votre zone DNS, il va falloir attendre un peu pour que l'information se propage. C'est notamment important pour la génération des certificats https qui sera simplifiée si les DNS sont à jour. Il faut attendre jusqu'à 24h pour une propagation complète. Je constate en général que les changements réalisés sur l'interface d'OVH se répercutent en quelques minutes.

5. Installer nginx

J'utilise nginx depuis quelques années en tant que serveur web ou en tant que passerelle vers d'autres serveurs. C'est un logiciel stable et simple à configurer.
Les dépôts de la Debian 9 contiennent une version de nginx un peu ancienne. C'est pourquoi il vaut mieux utiliser les dépôts d'Ondřej Surý qui maintient les paquets depuis de nombreuses années. Vous pouvez lui apporter un soutien financier sur son Patreon et voir son site.
Petit prérequis :~$ sudo apt install ca-certificates apt-transport-https
Copier
Lancez ensuite l'ajout du dépôt ainsi que de sa clé, puis l'installation de nginx :~$ wget -q https://packages.sury.org/nginx/apt.gpg -O- | sudo apt-key add -
~$ echo "deb https://packages.sury.org/nginx/ stretch main" | sudo tee /etc/apt/sources.list.d/nginx.list
~$ sudo apt update
~$ sudo apt install nginx -y
Copier

6. Installer PHP-FPM

Nous allons installer PHP 7.3, qui est actuellement au début de son cycle de vie. Il est supporté par les créateurs de PHP jusqu'au 6 décembre 2021.

Cliquez sur l'image pour voir la page officielle des versions de PHP.
On va installer PHP-FPM (pour FastCGI Process Manager), qui est un module permettant de faire le lien entre l'exécution de PHP et un serveur web type nginx.
Pour installer PHP 7.3, il faut ajouter le dépôt du même mainteneur que le paquet nginx :~$ wget -q https://packages.sury.org/php/apt.gpg -O- | sudo apt-key add -
~$ echo "deb https://packages.sury.org/php/ stretch main" | sudo tee /etc/apt/sources.list.d/php.list
~$ sudo apt update
~$ sudo apt install php7.3-fpm php7.3-gd php7.3-mysql php7.3-cli php7.3-common php7.3-curl php7.3-opcache php7.3-json php7.3-imap php7.3-mbstring php7.3-xml php7.3-zip
Copier

7. Créer une pool PHP

Pour avoir le contrôle sur l'utilisation des ressources et permettre une bonne fluidité lorsque les pages de WordPress sont chargées, il est intéressant de s'appuyer sur la création d'une pool de ressources pour PHP-FPM. C'est là qu'on va définir le nombre de process qui seront lancés, la localisation du socket de connexion, les droits, etc.
~$ echo "
~$ []
~$ listen = /var/run/.sock
~$
~$ listen.owner = www-data
~$ listen.group = www-data
~$ listen.mode = 0660
~$
~$ user = www-data
~$ group = www-data
~$
~$ pm = dynamic
~$ pm.max_children = 60
~$ pm.start_servers = 2
~$ pm.min_spare_servers = 2
~$ pm.max_spare_servers = 10
~$ " | sudo tee /etc/php/7.3/fpm/pool.d/.conf
~$
Copier
Après avoir créé la configuration du pool, il faut redémarrer le service de PHP-FPM :~$ sudo service php7.3-fpm restart
Copier
Vous pouvez vérifier que tout va bien et que le service tourne correctement grâce à la commande suivante :~$ sudo service php7.3-fpm status
Output :
● php7.3-fpm.service - The PHP 7.3 FastCGI Process Manager
Loaded: loaded (/lib/systemd/system/php7.3-fpm.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2019-06-29 18:46:14 CEST; 11s ago
Docs: man:php-fpm7.3(8)
Main PID: 22423 (php-fpm7.3)
Status: "Processes active: 0, idle: 4, Requests: 0, slow: 0, Traffic: 0req/sec"
Tasks: 5 (limit: 4915)
CGroup: /system.slice/php7.3-fpm.service
├─22423 php-fpm: master process (/etc/php/7.3/fpm/php-fpm.conf)
├─22424 php-fpm: pool undefined
├─22425 php-fpm: pool undefined
├─22426 php-fpm: pool www
└─22427 php-fpm: pool www
Jun 29 18:46:14 undefined systemd[1]: Starting The PHP 7.3 FastCGI Process Manager...
Jun 29 18:46:14 undefined systemd[1]: Started The PHP 7.3 FastCGI Process Manager.
Copier

8. Installer MariaDB / MySQL

Pour la base de données de WordPress, le plus simple est de mettre en place une base de type MySQL. MariaDB est un fork de MySQL qui s'impose aujourd'hui comme une référence open source. Si vous avez toujours utilisé MySQL, vous ne serez pas dépaysé par MariaDB.
Pour installer MariaDB, c'est très simple :~$ sudo apt-get install mariadb-server mariadb-client
Copier
Par défaut, l'installation de MariaDB n'est pas protégée pour un accès de l'extérieur. Il faut lancer un utilitaire qui va sécuriser certains paramètres.~$ sudo mysql_secure_installation
Output :
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none):
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.
Set root password? [Y/n]
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n]
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n]
... Success!
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n]
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n]
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!
Copier
Il faut répondre "yes" à quasiment toutes les questions. Au début un mot de passe "root" est demandé. Il faut juste appuyer sur entrée, car aucun mot de passe n'a encore été défini. Choisissez un mot de passe et notez-le précieusement.

9. Créer utilisateur et base de données MySQL

Dans un premier temps, il faut accéder à la console MySQL grâce à la commande suivante :~$ sudo mysql -u root -p
Copier
On va désormais créer un utilisateur pour MySQL, qui sera renseigné à WordPress pour l'accès à la base. L'utilisateur qui sera créé n'aura le droit d'accéder à la base que depuis localhost. Le mot de passe ci-dessous ne permet pas d'accéder à la base depuis l'extérieur. Mon conseil est de générer un mot de passe aléatoire en cliquant sur le bouton ci-dessous :
Voici les commandes à entrer pour créer une base de données, ajouter un utilisateur, définir son mot de passe et lui donner des droits :~$ CREATE DATABASE DOMAINE-DU-SITE_COM_prod;
~$ CREATE USER "DOMAINE-DU-SITE_COM"@"localhost";
~$ SET password FOR "DOMAINE-DU-SITE_COM"@"localhost" = password('MOT-DE-PASSE-MYSQL');
~$ GRANT ALL PRIVILEGES ON DOMAINE-DU-SITE_COM_prod.* TO "DOMAINE-DU-SITE_COM"@"localhost" IDENTIFIED BY "MOT-DE-PASSE-MYSQL";
~$ FLUSH PRIVILEGES;
Copier
Pour sortir de la console mysql, tapez exit ou Control + D.

10. Configurer nginx

Il faut désormais configurer nginx pour DOMAINE-DU-SITE.COM. Pour cela, on va définir une configuration individuelle pour DOMAINE-DU-SITE.COM, spécialement conçue pour WordPress. Elle se connecte à PHP-FPM grâce au socket précédemment défini et redirige toutes les requêtes vers /index.php pour permettre à WordPress de gérer proprement la réécriture d'URL.~$ echo "upstream php-fpm-DOMAINE-DU-SITE-COM {
~$     server unix:/var/run/DOMAINE-DU-SITE.COM.sock;
~$ }
~$
~$ server {
~$
~$     server_name ;
~$
~$     root /var/www/html//;
~$
~$     index index.php;
~$
~$ client_max_body_size 50M;
~$
~$     location / {
~$         try_files $uri $uri/ /index.php?$args;
~$     }
~$
~$     location = /favicon.ico {
~$         log_not_found off;
~$         access_log off;
~$     }
~$
~$     location = /robots.txt {
~$         allow all;
~$         log_not_found off;
~$         access_log off;
~$     }
~$
~$     location ~ .php$ {
~$         include fastcgi_params;
~$         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
~$         fastcgi_pass php-fpm-DOMAINE-DU-SITE-COM;
~$     }
~$
~$     location ~* .(js|css|png|jpg|jpeg|gif|ico)$ {
~$         expires max;
~$         log_not_found off;
~$     }
~$
~$     listen 80;
~$ } " | sudo tee /etc/nginx/sites-available/DOMAINE-DU-SITE.COM.conf
Copier
Avec le paquet nginx que vous avez installé, les configurations des sites sont placées dans le dossier/etc/nginx/sites-available. Il faut cependant les rendre explicitement actives en faisant un lien symbolique vers le fichier de configuration correspondant dans le dossier /etc/nginx/sites-enabled :~$ sudo ln -s /etc/nginx/sites-available/DOMAINE-DU-SITE.COM.conf /etc/nginx/sites-enabled/DOMAINE-DU-SITE.COM.conf
Copier
Il faut ensuite redémarrer nginx pour valider la configuration :~$ sudo service nginx restart
Copier
Si tout s'est bien passé, vous devriez maintenant voir votre serveur répondre une page blanche lorsque vous allez sur votre site : DOMAINE-DU-SITE.COM

11. Créer le dossier et télécharger WordPress

On n'a jamais été aussi proche ! Il faut désormais créer le dossier où seront stockés les fichiers de WordPress :~$ sudo mkdir -p /var/www/html/DOMAINE-DU-SITE.COM/
Copier
Puis télécharger la dernière version de WordPress, la décompresser et la déplacer dans le dossier précédemment créé :~$ wget http://fr.wordpress.org/latest-fr_FR.tar.gz
~$ tar -xzvf latest-fr_FR.tar.gz
~$ sudo mv ./wordpress/* /var/www/html/DOMAINE-DU-SITE.COM/
~$ sudo chown -R www-data:www-data /var/www/html/DOMAINE-DU-SITE.COM/
Copier
Vous pouvez aussi utiliser wp-cli pour installer et préconfigurer WordPress. Pour l'installer, entrez :~$ wget https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
~$ chmod +x wp-cli.phar
~$ sudo mv wp-cli.phar /usr/local/bin/wp
Copier
Pour télécharger la dernière version de WordPress en français :~$ wp core download --locale=fr_FR
Copier
Pour préconfigurer votre installation :~$ wp config create --dbname=DOMAINE-DU-SITE_COM_prod --dbuser=DOMAINE-DU-SITE_COM --dbpass= --dbhost=localhost --dbprefix=DOMAINE-DU-SITE_COM_
Copier
Et finalement :~$ wp core install --url= --title=? --admin_user=? --admin_password=? --admin_email=?
Copier
Plutôt cool !

12. Générer le certificat https

On est en 2019 ! C'est tellement facile de mettre en place un certificat https qu'il serait dommage de s'en passer ! Vous pouvez voir la documentation officielle de Let's Encrypt ici.
Il faut commencer par installer certbot. Cela se fait en deux étapes : d'abord ajouter les dépôts "backports" pour permettre au système d'installer des paquets moins testés que dans les dépôts principaux, puis installer certbot grâce à apt :~$ echo "deb https://deb.debian.org/debian stretch-backports main" | sudo tee /etc/apt/sources.list.d/backports.list
~$ sudo apt update
~$ sudo apt-get install certbot python-certbot-nginx -t stretch-backports
Copier
Puis lancer la procédure de création automatique des certificats :~$ sudo certbot --nginx
Output :
Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: DOMAINE-DU-SITE.COM
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for DOMAINE-DU-SITE.COM
Waiting for verification...
Cleaning up challenges
Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/DOMAINE-DU-SITE.COM.conf
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Redirecting all traffic on port 80 to ssl in /etc/nginx/sites-enabled/DOMAINE-DU-SITE.COM.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://DOMAINE-DU-SITE.COM
You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=DOMAINE-DU-SITE.COM
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Copier
Au début, certbot vous demandera votre email. Il pourra ainsi vous prévenir en cas de certificat arrivant à échéance ou en cas de fin de support d'une certaine technique de renouvellement de certificat. Très utile !
Il demande ensuite pour quel site vous voulez générer un certificat https : choisissez 1 ou laissez vide. Enfin, certbot vous demande si vous souhaitez continuer à autoriser les requêtes en http simple. Pour ma part, j'utilise toujours l'option 2 ("2: Redirect - Make all requests redirect to secure HTTPS access."), qui force la redirection vers la version https:// du site.
Finalisez la configuration en redémarrant nginx :~$ sudo service nginx restart
Copier
Le certificat généré a une durée de validité de trois mois. Il faut donc mettre en place le renouvellement automatique pour ne plus avoir à y penser. Ça tombe bien, c'est très simple :~$ echo "PATH=/sbin:/bin:/usr/sbin:/usr/bin
~$ 0 02 * * * /user/bin/certbot renew
~$ " > crontab_config
~$ sudo crontab crontab_config
~$ rm crontab_config
Copier
Tous les jours à 2h du matin, la commande pour renouveler les certificats sera lancée ! Enjoy !

13. Installer WordPress et WooCommerce

Rendez-vous sur votre site ! Si tout va bien, vous devriez voir la page de démarrage de l'installation de WordPress :
Sur l'écran suivant, vous devez rentrer différents paramètres :
Si vous avez suivi les instructions précédentes, voici les valeurs à entrer :
  • Nom de la base de données : DOMAINE-DU-SITE_COM_prod
    Copier
  • Identifiant : DOMAINE-DU-SITE_COM
    Copier
  • Mot de passe :
    Copier
  • Adresse de la base de données : localhost
    Copier
  • (optionnel)
    Préfixe des tables : DOMAINE-DU-SITE_COM_
    Copier
Il ne vous reste plus qu'à lancer l'installation et configurer WordPress à votre guise !
Ensuite, pour installer WooCommerce, rendez-vous dans l'interface d'administration de WordPress, dans la section Extensions et cliquez sur Ajouter :
Dans le champ de recherche en haut à droite, entrez "WooCommerce" puis appuyez sur la touche Entrée :
WooCommerce apparaît en premier dans les résultats. Lancez l'installation en cliquant sur "Installer" :
Il faut ensuite activer le plugin en cliquant sur le bouton Activer :
Vous êtes ensuite redirigé vers l'écran de première configuration de votre boutique WooCommerce !

14. Installer un pare-feu et empêcher le login root

Encore un petit effort ! Pour finaliser la sécurisation du serveur, on va installer un pare-feu, créer les règles nécessaires pour conserver certains services, puis désactiver le login root et empêcher les attaques de type force brute.
On commence par installer le pare-feu ufw :~$ sudo apt install ufw
Copier
Il faut ensuite autoriser ssh, http et https :~$ sudo ufw allow ssh
~$ sudo ufw allow http
~$ sudo ufw allow https
Copier
Puis activer le firewall :~$ sudo ufw enable
Output :
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
Copier
Pour désactiver le login root, il faut éditer le fichier de configuration de ssh, chercher la ligne qui contient "PermitRootLogin" et mettre la valeur "no". Vous pouvez aussi juste copier/coller la commande suivante :~$ sudo sed -i 's/PermitRootLogin yes/PermitRootLogin no/g' /etc/ssh/sshd_config
Copier
Pour appliquer ce changement, il faut redémarrer le service sshd :~$ sudo service sshd restart
Copier
On termine la sécurisation par une protection contre les attaques de type force brute. On va empêcher un système ou un utilisateur quelconque de venir essayer toutes les combinaisons possibles pour accéder au serveur. Pour cela on utilise fail2ban :~$ sudo apt-get install fail2ban
Copier
Si vous voulez approfondir l'utilisation de fail2ban, allez voir ce guide sur geek17.com.

Et voilà, c'est tout ! J'espère que ce guide vous a plu, autant dans son fond que dans sa forme ;) N'hésitez pas à me faire un petit coucou dans les commentaires, cela me fera très plaisir. Et si une commande bloque ou que vous avez trouvé une erreur, signalez la dans les commentaires, je corrigerai cela dès que possible. Bonne journée à vous ! Conrad

Recevez régulièrement des liens intéressants, mes nouveaux articles et les nouvelles de mes projets
Suivez-moi sur LinkedIn