WordPress

Ubuntu 18.04 LTS – Installation de WordPress avec Nginx, PHP-FPM, MariaDB et SSL/TLS

WordPress est un système de gestion de contenu (CMS) qui permet de créer et gérer différents types de sites Internet : blog, site e-commerce, site vitrine ou encore portfolio.

Gratuit et libre, WordPress possède de nombreux avantages tels que sa simplicité d’utilisation et d’administration, sa facilité d’indexation dans les moteurs de recherche, une personnalisation importante grâce à de nombreux plugins disponibles et une communauté WordPress très active.

WordPress a besoin d’un serveur web (Nginx), de PHP, d’une interface permettant la communication entre le serveur web et PHP (PHP-FPM) et d’une base de données (MariaDB). Nous améliorerons les performances de WordPress grâce à OPCache et sécuriserons les échanges grâce à un certificat SSL/TLS délivré par Let’s Encrypt.

1 – Prérequis

  • Vous devez disposer d’Ubuntu 18.04 LTS.
  • Votre utilisateur doit avoir accès à sudo.

Si vous ne possédez pas de serveur dédié ou de nom de domaine, je vous conseille les VPS de 1&1. Les serveurs sont rapides (basés en France), fiables et surtout très abordables. Les formules Cloud S ou Cloud M sont amplement suffisantes.

2 – Nginx

Notre choix se portera sur le serveur HTTP Nginx pour une question de performances. Nginx est reconnu pour ses hautes performances, sa stabilité, son ensemble de fonctionnalités, sa configuration simple ainsi que sa faible consommation en ressources.

2.1 – Installation

Installez le paquet nginx :

2.2 – Configuration

Modifiez les directives suivantes du fichier de configuration Nginx /etc/nginx/nginx.conf :

  • worker_processes 8; : l’un des paramètres à ajuster immédiatement est le worker_processes. Pour profiter pleinement de la puissance de votre serveur, il est recommandé de mettre autant de worker_processes que de cœurs disponibles sur votre serveur. Pour connaître le nombre de cœurs sur votre serveur, il suffit de lancer la commande :
  • server_tokens off; : pour des raisons de sécurité, il est recommandé de désactiver l’envoi d’informations telles que le numéro de version de votre Nginx. Pour cela, décommentez cette directive dans le bloc http.

3 – Installation et téléchargement de WordPress

  • Téléchargez la dernière version française de WordPress :
  • Décompressez l’archive :
  • Renommez le dossier :
  • Supprimez l’archive téléchargée :

4 – Droits Unix

Lors du déploiement basique d’un serveur HTTP, l’utilisateur sous lequel fonctionne ce serveur (Apache, Nginx…) est la plupart du temps www-data, nobody ou apache. Cela signifie que si plusieurs sites existent sous la même instance de Nginx, tous utilisent le même utilisateur. Or si l’un des sites s’avère corrompu par un utilisateur malveillant alors l’assaillant peut profiter pleinement de tous les droits de l’utilisateur sous lequel tourne le serveur web. Tous les sites s’avèrent donc vulnérables.

Pour des raisons évidentes de sécurité, il est donc recommandé de cloisonner ces utilisateurs et d’avoir un utilisateur dédié à la gestion du dossier myblog. Cet utilisateur aura des droits aussi restreints que possible à ce répertoire.

Nous allons donc modifier le propriétaire du répertoire /var/www/myblog et l’attribuer à un nouvel utilisateur dédié : myblog.

Par ailleurs, Nginx est lancé sous l’utilisateur www-data et doit avoir accès en lecture au répertoire /var/www/myblog pour lire les ressources statiques (HTML, CSS, JS, etc.). Nous allons donc attribuer le répertoire /var/www/myblog au groupe www-data.

Enfin nous retirerons toutes les permissions de ce répertoire aux autres utilisateurs.

  • Créez un utilisateur myblog :
  • Modifiez le propriétaire et le groupe du répertoire /var/www/myblog :
  • Retirez toutes les permissions aux autres utilisateurs :

5 – PHP et ses modules

WordPress nécessite certains modules PHP pour fonctionner :

  • PHP PDO : connecteur pour MariaDB
  • PHP CURL : nécessaire pour certains plugins
  • PHP GD : opérations sur les images
  • PHP INTL : support de l’internationalisation.

Installez les paquets suivants :

Vous devez disposer d’une version de PHP égale ou supérieure à 5.4.
Pour connaître la version installée sur votre système, tapez la commande suivante :

6 – PHP-FPM

Le module PHP-FPM permet la communication entre le serveur Nginx et PHP, basée sur le protocole FastCGI. Ce module, écoutant sur le port 9000 par défaut ou sur un socket UNIX, permet notamment l’exécution de scripts PHP dans un processus indépendant de Nginx avec des UID et GID différents. Il sera alors possible, dans le cas de la gestion de plusieurs applications sur un même serveur, de créer et configurer un groupe (appelé aussi pool) par application. Un pool définit notamment le UID/GID des processus PHP et le nombre de processus minimum, maximum ou encore le nombre de processus en attente à lancer.

6.1 – Installation

Installez le paquet php-fpm :

6.2 – Création du pool myblog

Créez le pool dédié à WordPress en créant le fichier de configuration suivant : /etc/php/7.2/fpm/pool.d/myblog.conf

Certaines valeurs sont très arbitraires et seront, en fonction des ressources disponibles sur votre serveur et celles que vous souhaiterez dédier à votre WordPress, différentes d’une configuration à l’autre. Cependant ces différentes directives respectent certaines conditions :

  • [myblog] : nom du pool. Il est possible de créer plusieurs pools par fichier. Chaque pool doit commencer par cette directive.
  • listen : interface d’écoute des requêtes. Les syntaxes acceptées sont ADRESSE_IP:PORT (exemple : listen = 127.0.0.1:9000) et /path/to/unix/socket (exemple : listen = /var/run/myblog.sock). Le socket est représenté comme un simple fichier sur le système et permet d’interfacer des processus entre eux sans passer par la couche réseau du système, ce qui est inutile lorsque Nginx et PHP-FPM sont hébergés sur le même serveur. Je vous conseille donc d’utiliser un socket.
  • listen.owner & listen.group : affecte l’utilisateur et le groupe au socket Unix si utilisé. Ces deux paramètres peuvent être associés au paramètre listen.mode qui définit les permissions du socket (660 par défaut). Il est important que Nginx ait les droits de lecture sur le socket Unix.
  • user & group : utilisateur et groupe sous lesquels le pool de processus sera exécuté. Cet utilisateur et ce groupe doivent bien sûr exister sur votre système et surtout accéder aux fichiers PHP de votre WordPress. Cela veut dire aussi que chaque fichier et répertoire créé dans WordPress appartiendra à cet utilisateur et à ce groupe. Comme nous l’avons vu dans le chapitre dédié aux droits Unix, chaque fichier devra appartenir à l’utilisateur myblog et au groupe www-data.
  • pm : directive acceptant les 3 valeurs suivantes : static, dynamic et ondemand.
    • static : les processus, au nombre de pm.max_children, sont continuellement actifs (quelle que soit la charge et l’affluence de votre WordPress) et sont susceptibles de consommer de la mémoire inutilement. Cette directive est recommandée si WordPress est l’unique application de votre serveur.
    • dynamic : le nombre de processus fils pourra varier suivant la charge. Cependant, nous gardons le contrôle sur le nombre de processus fils à créer au démarrage du serveur, le nombre de processus maximum, en attente de requêtes, etc. Les directives suivantes deviennent obligatoires : pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers. Cette directive est recommandée si vous avez plusieurs pools avec un fort trafic (plus de 10 000 requêtes/jour).
    • ondemand : aucun processus fils n’est lancé au démarrage du serveur, les processus s’activent à la demande et auront une durée de vie définie par la directive pm.process_idle_timeout. L’intérêt de cette directive est de libérer de la mémoire en cas de faible charge mais celle-ci peut légèrement augmenter le temps de réponse de votre WordPress. Cette directive est recommandée si vous avez plusieurs pools avec potentiellement une faible affluence.

    Nous choisirons et détaillerons ici la directive ondemand qui présente l’avantage de créer des processus en fonction de la demande et de libérer des ressources sur le serveur lors de période de faible affluence.

  • pm.max_children : nombre maximum de processus fils. La valeur du paramètre pm.max_children varie d’un système à l’autre. Voici la procédure à réaliser pour déterminer la valeur de ce paramètre :
    • Arrêtez le service php-fpm :

    • Affichez la mémoire disponible (colonne available) sur votre système :

      Sur cet exemple, le système dispose de 3539Mo de RAM disponible. La quantité de RAM que vous souhaitez allouer au maximum à WordPress dépend de vous et des autres services actifs que vous disposez sur ce même système. Dans notre exemple, nous partirons du principe que nous souhaitons allouer au maximum 1Go (1000Mo) de RAM à WordPress.

    • Affichez la mémoire utilisée par un processus fils php-fpm :

    • Déterminez le nombre de pm.max_children en appliquant la méthode de calcul suivante :

      pm.max_children = mémoire allouée (en Mo) / mémoire utilisée par un processus fils
      Dans notre exemple : 1000 / 18 = 55

    • Éditez à nouveau le fichier /etc/php/7.2/fpm/pool.d/myblog.conf et ajustez la valeur du paramètre pm.max_children :

  • pm.process_idle_timeout : durée en secondes avant qu’un processus fils inactif soit détruit.
  • pm.max_requests : nombre de requêtes que chaque processus fils devra exécuter avant d’être détruit. Cette valeur ne doit pas être trop élevée afin de contourner d’éventuelles fuites mémoires, ni trop faible pour ne pas solliciter régulièrement le CPU à chaque création de processus fils. 500 reste une valeur recommandée.

Redémarrez le service php-fpm afin d’activer le nouveau pool myblog :

7 – Création de la base de données sous MariaDB

7.1 – Installation de MariaDB

Installez les paquets suivants :

7.2 – Configuration de MariaDB

Lancez le script de configuration (recommandé) :

7.3 – Création de la base de données myblog

  • Tout d’abord, connectez-vous sur l’interface MySQL avec l’utilisateur root et grâce au mot de passe saisi lors de la configuration de MariaDB :

  • Créez la base de données myblog :

    Tout comme pour la gestion du répertoire myblog et pour plus de sécurité, vous allez tout d’abord créer un utilisateur MySQL myblog dédié à la base de données myblog, renseigner un mot de passe et ensuite lui donner les droits sur cette base de données :

8 – Nom de domaine & virtual host

Si vous souhaitez accéder à votre WordPress de l’extérieur (et non seulement via localhost), il est nécessaire de faire pointer votre domaine ou sous-domaine vers l’IP de votre serveur. Pour cela, commencez par modifier les règles DNS dans l’interface administrateur du fournisseur de votre nom de domaine.


  • Créez le fichier suivant /etc/nginx/sites-available/myblog et modifiez les lignes en surbrillance en fonction de votre configuration :
  • Activez le virtual host :
  • La nouvelle configuration sera prise en compte après redémarrage du service Nginx :

9 – SSL/TLS avec Let’s Encrypt

Let’s Encrypt est une autorité de certification libre, automatisée et ouverte. Cette autorité fournit des certificats gratuits X.509 pour le protocole cryptographique SSL/TLS au moyen d’un processus automatisé destiné à se passer du processus complexe actuel impliquant la création manuelle, la validation, la signature, l’installation et le renouvellement des certificats pour la sécurisation des sites internet. En janvier 2018, Let’s Encrypt a livré plus de 64 millions de certificats.

9.1 – Installation

Installez les paquets software-properties-common et certbot :

9.2 – Génération des certificats

Let’s Encrypt permet de générer de différentes façons plus ou moins automatisées un certificat. La méthode standalone permet de générer simplement un certificat. En revanche, celle-ci demande d’arrêter le serveur Nginx et ceci est valable à chaque renouvellement dudit certificat. Il existe aussi des plugins Apache et Nginx entièrement automatisés. Ces plugins mettent à jour automatiquement la configuration des virtual hosts. Dans cet article, nous recommandons d’utiliser le plugin webroot pour Nginx qui permet de générer et renouveler son certificat sans interrompre le serveur Nginx.

Le plugin webroot crée un fichier temporaire /var/www/myblog/.well-known/acme-challenge dans le dossier racine de votre WordPress, celui-ci permettra aux serveurs de Let’s Encrypt de valider votre certificat en appelant ce fichier temporaire.

  • Générez votre certificat en remplaçant email@mondomaine.com et mondomaine.com par vos informations personnelles :
    Vous obtiendrez 4 fichiers dans le répertoire /etc/letsencrypt/live/myblog.mondomaine.com :

    • cert.pem : le certificat de votre domaine myblog.mondomaine.com
    • chain.pem : le certificat Let’s Encrypt
    • fullchain.pem : les certificats cert.pem et chain.pem combinés
    • privkey.pem : la clé privée du certificat.
  • SSL/TLS utilise un système de chiffrement asymétrique (comme RSA ou Diffie-Hellman) afin de sécuriser les échanges de vos flux. Par défaut, Nginx utilise une clé de 1048 bits. En augmentant la longueur de la clé à 4096 bits, vous augmenterez ainsi la sécurité de votre protocole SSL/TLS.

    Générez une nouvelle clé Diffie-Hellman (DH) de 4096 bits et attribuez-lui un minimum de permissions :

  • Ajoutez ou modifiez les lignes en surbrillance dans votre virtual host (/etc/nginx/sites-available/myblog) en remplaçant les chemins des directives ssl_certificate, ssl_certificate_key, ssl_trusted_certificate et ssl_dhparam par l’emplacement de vos certificats et de la clé DH précédemment générés :

  • Rechargez votre configuration Nginx :

9.3 – Renouvellement automatique du certificat

Les certificats délivrés par Let’s Encrypt sont valides 90 jours. L’outil certbot fournit une option renew permettant de renouveler l’ensemble des certificats présents sur votre serveur si et seulement si ceux-ci expirent dans moins de 30 jours.

Nous allons créer une règle crontab où le script de renouvellement sera planifié pour exécution tous les lundis à 23h42. Les traces liées à l’exécution du script seront enregistrées dans un fichier /var/log/le-renew.log.

  • Éditez la crontab :
  • Ajoutez la ligne suivante :
  • Sauvegardez et quittez.

10 – HTTP2

Je vous conseille vivement d’activer le nouveau protocole HTTP2 qui augmentera la sécurité et la rapidité de votre WordPress.

HTTP2 permet notamment :

  • la compression des headers des requêtes et des réponses qui permet de réduire la bande passante lorsque les headers (comme les cookies) sont similaires
  • le multiplexage des requêtes au serveur consistant à faire passer de multiples informations via un seul tuyau de transmission. Ainsi, on économise les multiples connexions entre le client et le serveur. Les requêtes, quant à elles, sont effectuées simultanément par le navigateur. Les requêtes ne se suivent donc plus les unes derrière les autres (HTTP1) et les plus prioritaires (CSS par exemple) ne sont plus bloquées par les moins prioritaires (images par exemple)
  • le push des ressources du serveur au navigateur. Désormais, le serveur pourra envoyer l’ensemble des ressources référencées dans une même page (CSS, JS…), avant même que le navigateur n’ait analysé celle-ci.

L’activation du protocole HTTP2 est très simple et consiste en l’ajout de la directive http2 dans votre virtual host :

Une fois la modification effectuée, n’oubliez pas de recharger votre configuration Nginx :

11 – Améliorer les performances de votre WordPress avec OPcache

OPcache (qui signifie Optimizer Plus Cache) est introduit depuis la version 5.5.0 de PHP. Il sert à cacher l’opcode de PHP, c’est-à-dire les instructions de bas niveau générées par la machine virtuelle PHP lors de l’exécution d’un script. Autrement dit, le code pré-compilé est stocké en mémoire. Cela évite ainsi l’étape de compilation à chaque requête PHP. De plus, OPcache va optimiser l’exécution du code afin d’en améliorer les performances.

  • Éditez le fichier /etc/php/7.2/fpm/php.ini, décommentez et modifiez les lignes suivantes dans la section [opcache] :
  • La nouvelle configuration sera prise en compte après redémarrage du service PHP-FPM :

12 – Configuration de WordPress

Lancez votre navigateur et rendez-vous à l’adresse suivante : http://myblog.mondomaine.com/.

[Cliquez sur les images pour suivre chaque étape de la configuration de WordPress]

La configuration est désormais terminée ! Connectez-vous avec le login et le password que vous venez de renseigner.

13 – Améliorer les performances de votre WordPress avec W3 Total Cache

W3TC permet d’améliorer considérablement le temps de réponse de votre WordPress en proposant notamment la compression et la minification de vos ressources statiques (HTML, JS, etc.), la mise en cache de vos pages et la prise en charge d’un éventuel CDN.

  • Téléchargez et activez l’extension W3 Total Cache dans Extensions → Ajouter → Rechercher des extensions…
  • Ajoutez la ligne suivante dans votre virtual host en modifiant la directive include par le chemin de votre WordPress :
  • La nouvelle configuration sera prise en compte après redémarrage du service Nginx :

14 – WordPress sur Android…

Découvrez l’excellente application WordPress qui vous permettra de créer et de découvrir du contenu sur votre mobile. Rédigez, éditez, et publiez des articles sur votre site, accédez à vos stats et inspirez vous d’articles à partir de vos blogs favoris.

WordPressWordPressDisponible sur Google Play


Ubuntu Server 18.04 LTSNginx 1.14.0
PHP7-FPM 7.2.3
MariaDB 10.1.29
WordPress 4.9.6

AuteurEdouard WATTECAMPS

1 réponse

Répondre

Se joindre à la discussion ?
Vous êtes libre de contribuer !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.