Installer un serveur LEMP sous Debian (NGinx mainline – PHP7 – MySQL MariaDB)

Grâce à la magie d’Internet, trouver des tutos pour vous expliquer l’installation et la configuration d’un serveur Web est simple comme bonjour. Cela dit, je reprocherai à de nombreux tutos d’être ancrés dans le passé sans forcément préciser les numéros de version des packages utilisés notamment (nous avons toujours la version de l’OS utilisé, encore heureux). Bref, en pleine migration d’un hébergement mutualisé vers un serveur dédié, je me suis dit que c’était l’occasion de vous faire un petit tuto d’installation sur la base d’un serveur LEMP sous Debian. La particularité est que nous allons utiliser la branche mainline de NGinx (1.9.12), PHP7.0 et plus accessoirement une BDD sous MariaDB. Pourquoi NGinx Mainline et PHP7.0 ? Car à terme, nous les verrons de plus en plus à environnement équivalent et qu’il vaut mieux regarder devant soi que derrière. Pour être plus précis, le comportement de NGinx a évolué dans la mouture Mainline (qui viendra remplacer celle que tout le monde connaît) et PHP7.0 a aussi un fonctionnement qui diverge de PHP5. Ce tuto est donc l’occasion de découvrir ces nouveaux fonctionnements permettant un paramétrage nettement plus simple soit dit en passant.

Préambule

J’utilise Debian sous version 8 (Jessie), nous utiliserons les dépôts dotdeb pour PHP7.0 et nginx.org pour Nginx (qui l’eut cru ?). L’installation des packages se fera par apt-get nativement installé dans Jessie (à vous d’installer aptitude si vous êtes un inconditionnel d’Ubuntu notamment). Tous les codes présentés sont affichés comme si j’étais root tout simplement car j’ai l’habitude de passer par su, à vous de rajouter sudo au besoin par exemple ou tout simplement d’être root, ce qui est certes déconseillé mais comme nous sommes dans l’hypothèse d’un serveur tout beau tout neuf, nous pouvons tolérer ce débordement.

Pour être le plus précis possible sur les versions de packages, à date de cet article, nous utiliserons :

  • nginx mainline > 1.9.12
  • PHP7.0 > 7.0.4

Enfin, si vous vous demandez pourquoi je suis parti là-dessus, c’est que HTTP2 m’intéresse et côté NGinx, seule la version Mainline est en capacité de gérer pleinement ce protocole. C’est aussi l’occasion de vous dire que c’est le premier article d’une série qui se composera de la mise en place d’un serveur mail avec le trio Postfix / Dovecot / Rainloop, de la mise en place de certificats SSL (indispensables à notre serveur mail et à HTTP2 — la faute aux navigateurs) ainsi qu’un aparté sur la sécurisation car nous trouvons beaucoup de choses sur le Web mais là encore, pas toujours très détaillé.

Installation

Le tuto devrait être compréhensible même pour un débutant mais si c’est votre cas, je vous conseille de ne pas vous en contenter en production, il y a toute la partie sécurité qui n’est pas abordée pour le moment et nous sommes sur les paramétrages de base d’un serveur Web, par exemple pour accueillir un CMS. Selon ce que vous souhaitez faire, il faudra peut-être aller plus loin.

Ajout des dépôts pour récupérer NGinx et PHP7.0

Ajout des dépôts nginx mainline et dotdeb pour récupérer les derniers packages. Je vous invite à lire la documentation de dotdeb.org et nginx.org pour mieux comprendre ce que vous allez faire.

nano /etc/apt/sources.list

J’ajoute les lignes suivantes à la fin du fichier :

# dotdeb
deb http://packages.dotdeb.org jessie all
deb-src http://packages.dotdeb.org jessie all

# nginx
deb http://nginx.org/packages/mainline/debian/ jessie nginx
deb-src http://nginx.org/packages/mainline/debian/ jessie nginx

Téléchargement et ajout de la clé d’identification de Dotdeb et Nginx.org

wget http://www.dotdeb.org/dotdeb.gpg
apt-key add dotdeb.gpg
wget http://nginx.org/keys/nginx_signing.key
apt-key add nginx_signing.key

wget sert à récupérer la signature des packages, apt-key l’installe sur votre serveur. Sans cela, vous ne pourrez pas récupérer les packages pour des raisons de sécurité évidentes.

Mise à jour des listes (indispensable) et au cas où, mise à jour des packages au besoin.

apt-get update
apt-get upgrade

Installation de nginx mainline et PHP7.0

On installe le package pour nginx

apt-get install nginx

On installe php7.0. Le trio php7.0 + fpm + mysql est le minimum syndical, ce qu’il faut éviter, c’est d’installer juste php7.0 car il va récupérer aussi des composants pour Apache et ce n’est pas franchement ce que nous souhaitons. J’ajoute curl, json, gd, mcrypt et opcache qui sont relativement classiques sur un serveur.

apt-get install php7.0 php7.0-fpm php7.0-mysql php7.0-curl php7.0-json php7.0-gd php7.0-mcrypt php7.0-opcache

C’est toujours bon de vérifier les versions

nginx -v
php7.0 -v

Votre serveur sera désormais accessible (du moins la page HTML de NGinx) avec ce bon vieux « welcome to nginx! ». Pour info, l’emplacement original des sites Web dans cette version est /usr/share/nginx/html au cas où vous les chercheriez.

Aparté sur PHP7.0

Vous noterez que je parle toujours de PHP7.0, c’est pour vous signifier qu’il y a eu un changement de gestion des versions pour PHP. Auparavant, vous aviez PHP5 qui pouvait débarquer avec une flanquée de sous versions, de PHP5.3 à 5.6 notamment. Un beau bordel quand nous y repensons. Désormais, PHP se gère branche par branche de manière très claire, de mois en mois, les updates de PHP7.0 changent la nomenclature selon cette règle : PHP7.0.xx. C’était le cas avant mais c’était vu comme un paquet global.

Si je vous raconte tout cela, c’est aussi pour souligner que sur le serveur, vous n’appelez pas PHP7 comme vous appeliez PHP5 sinon PHP7.0 et un jour ce sera PHP7.1 ! Une erreur commune lorsque nous n’y prêtons pas attention serait par exemple d’indiquer qu’il faut écouter php7-fpm.sock au lieu de php7.0-fpm.sock. L’erreur est d’autant plus fréquente que les premières betas de PHP7 fonctionnaient comme PHP5, la lecture d’un vieux tuto vous enverra dans le mur. Grâce à ce système, il sera moins hasardeux de faire tourner une appli sur php7.1 tandis que sa voisine tourne sur php7.0.

Paramétrage de NGinx mainline

NGinx évolue dans le bon sens, la version mainline (> 1.9.12) est paramétrable sans toucher aux fichiers par défaut, ce qui est une très bonne chose pour éviter des bugs lors d’un update. C’était certes déjà le cas auparavant mais il y avait tout un tas de lignes à mettre un peu partout dans les fichiers de config pour y arriver. Là, c’est nickel, exit le duo sites-enabled / sites-available, tout se passe désormais dans le dossier /etc/nginx/conf.d/ et les fichiers de configuration sont sous la forme *.conf.
Je me place justement dans conf.d pour créer mes fichiers de config

cd /etc/nginx/conf.d/

À titre d’exemple, continuons la configuration de NGinx en précisant un dossier de destination pour un site web qui aurait pour domaine domaine.tld. Normalement, vous êtes toujours dans le dossier conf.d de NGinx, sinon, retournez-y et créons un fichier de configuration pour notre site.

nano domaine_tld.conf

Je le nomme ainsi pour bien repérer le domaine concerné et j’y ajoute le contenu suivant

server {
        listen       80;
        server_name  domaine_tld.conf;
        root   /var/www/domaine_tld;
        index  index.html index.htm index.php;
	
	location / {
        try_files $uri $uri/ =404;
    }

    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }	
	
	location = /favicon.ico {
		log_not_found off;
		access_log off;
	}

	location = /robots.txt {
		allow all;
		log_not_found off;
		access_log off;
	}

	# Configuration PHP7.0
	location ~ \.php$ {
		try_files $uri =404;
		fastcgi_split_path_info ^(.+\.php)(/.+)$;
		fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
		fastcgi_index index.php;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include fastcgi_params;
	} 

}

Vous enregistrez et voilà une bonne chose de faite. Concrètement, nous disons au serveur (NGinx) que lorsqu’il voit arriver domaine.tld il le redirige vers le dossier /var/www/domaine_tld. J’ai laissé quelques paramètres basiques pour récupérer les pages d’erreur par défaut, l’utilisation d’un favicon.ico et du robots.txt histoire que vous ne soyez pas dépaysé, il faut compléter le fichier en fonction des besoins. Par exemple, dans cette configuration, WordPress ne pourra pas gérer la réécriture d’URL.

Nous expliquons aussi à NGinx que lorsqu’il y a un accès à un fichier PHP il faut aller écouter le socket de php7.0-fpm (nous utilisons FPM donc ;)) en incluant les paramètres du fichier fastcgi_params (dans lequel vous n’avez plus rien à faire, merci PHP7.0 !). Remarquez aussi pour la directive index la présence de index.php.

Enfin, vous voyez que le site est placé dans /var/www/, habitude d’Apache plus que celle de NGinx. En réalité, c’est à adapter selon vos besoins et la configuration de vos partitions, le placer dans /home/user/ peut être plus pertinent par exemple. Là, je suis dans un contexte où vous n’auriez qu’un seul site avec éventuellement quelques applications satellites (telle qu’une messagerie) et que vous auriez pris le temps d’attribuer un espace disque raisonnable à /var/ (l’installation par défaut de Debian attribue l’essentiel de l’espace disque à /home/ qui se retrouve sur une partition dédiée.

Création du dossier du site

Je prends d’abord soin de revenir à la racine du site puis je crée mon un dossier avec mkdir en utilisant le paramètre -p qui permet de créer les dossiers parents si nécessaire.

cd
mkdir -p /var/www/domaine_tld

On donne les droits de /var/www/ à www-data:www-data. Un grand classique. J’utilise le paramètre -R qui donne les droits de manière récursive. Pratique pour ne pas s’emmerder lors de l’installation d’un nouveau serveur avec plusieurs sites.

chown -R www-data:www-data /var/www

Donner le droit à NGinx d’utiliser PHP7.0

Par défaut, c’est l’utilisateur nginx qui va faire appel à PHP7.0, le problème est que les fichiers de config par défaut de PHP7.0 va chercher www-data du groupe www-data. Deux possibilités, soit vous ajoutez nginx au groupe www-data, soit vous vous cassez la tête à ne pas suivre la configuration par défaut. Ici, nous ne nous casserons pas la tête.

adduser nginx www-data

Test de la config nginx et redémarrage si tout est ok.

service nginx configtest
service nginx restart

Si vous accédez directement au site, vous aurez une erreur 403 car il n’y aucun fichier dans notre dossier. Vous pouvez y mettre un fichier html et un fichier php avec la classique commande <?php phpinfo(); ?> et ainsi vérifier que tout fonctionne.

Installation de Maria-DB

L’installation de Maria-DB est très simple.

apt-get install mariadb-server

Il faudra choisir un mot de passe pour le user root, je vous invite à ne pas déconner et utiliser un code complexe. Le root d’une BDD ne doit de toute façon pas être utilisé autrement que par le serveur lui-même. Dès votre installation terminée, je vous encourage à créer un autre utilisateur avec seulement les droits dont il a besoin.
Avec PHP7.0 dans le coeur du système et sans la présence de PHP5, il ne faut surtout pas utiliser PHPMyAdmin, il installera des dépendances dont PHP5 et pourrait casser votre configuration. A date, PHPMyAdmin n’est pas encore compatible.

Toutefois, lorsque l’on utilise un serveur avec seulement 2 ou 3 sites, vous pouvez très bien vous en passer. Je ne parle bien évidemment pas de tout se taper en ligne de commande, vous pouvez en revanche utiliser des outils plus légers comme adminer, l’interface n’est pas très sexy mais on peut l’ajouter au serveur au besoin (via FTP) car c’est un simple fichier PHP. Cela fait au final un outil de moins sur votre serveur et donc une faille de moins à gérer.

Conclusion

C’est terminé, vous avez un serveur prêt à l’emploi pour y installer votre site. En prenant le temps néanmoins de compléter le paramétrage de NGinx et en mettant en place les BDD selon vos besoins.

Commentaires

  1. Bonjour,
    merci pour ce superbe tuto, même si pas spécialiste du tout, j’ai réussi à l’appliquer sur mon serveur (avec un peu de galères qd même mais ça c’est ma faute!!!!)… prochaine étape la re-direction https???? 🙂

    1. Bonjour Fidoboulettes,

      C’est prêt de mon côté pour le https et avec le support de ALPN grâce à Angristan qui propose une super petite installation de NGinx avec OpenSSL. Ce sera prochainement. Avant, je vais faire une petite aparté sur ma stratégie de sauvegarde.

  2. Bonjour ca ne marche pas il n’y a pas un probleme un coup on utilise le /usr/share/nginx/html et sur le Web.conf on utilise /var/www/ ??

    Merci d’avance

    1. Salut Anthony,
      /usr/share/nginx/html est le dossier par défaut de Nginx, mais je fais le choix dans mon exemple de mettre mon site dans /var. Une autre possibilité est de créer un utilisateur par site (pour cloisonner notamment) et qui finissent donc dans /home.

      Par rapport au tuto, ma question est, est-ce que tu as mis des fichiers dans ton dossier /var/www/ton_site ? Lorsque je teste, j’y glisse toujours un fichier HTML et un fichier PHP avec un phpinfo() dedans. Le premier me garantie que ma configuration NGinx est bonne (je pointe vers le bon dossier), le deuxième me permet de vérifier que Nginx communique bien avec PHP.