Debian – comment installer Nginx en tant que serveur Web ?

I. Présentation

Dans ce tutoriel, nous allons voir comment mettre en place un serveur Web Nginx sur Debian 10, dans le but d'héberger un site Web qui s'appuie sur PHP.

Nginx, que l'on prononce Engine-X, est un logiciel open source qui permet de monter un serveur web, mais également un reverse proxy pour mettre en cache des éléments et assurer la répartition de charge entre plusieurs serveurs Web.

À la différence d'Apache, Nginx est pensé pour les sites à très fort trafic : il est d'ailleurs connu et reconnu pour être un logiciel très performant. Dans de nombreux cas, il n'est pas utilisé en tant que serveur Web directement, mais plutôt en tant que reverse proxy pour gérer les connexions des clients en frontal.

Pour ma part, je vais utiliser une machine sous Debian 10 pour mettre en place le serveur Nginx.

🎥 Débutez avec Nginx grâce à ce tutoriel vidéo (installation, création d'un site, intégration de PHP, mise en place d'un certificat SSL, etc.).

II. Installer Nginx

Commençons par installer le paquet Nginx, mais avant cela mettons à jour le cache de paquets sur notre machine :

sudo apt update -y

Ensuite, on passe à l'installation du paquet Nginx, ce qui est très simple puisqu'il est disponible dans les dépôts officiels.

sudo apt install nginx -y

Lorsque l'installation est effectuée, on peut regarder quelle version est installée à l'aide de la commande suivante (similaire à celle d'Apache ou d'autres paquets) :

sudo nginx -v

Suite à l'installation, le serveur Nginx est déjà démarré, on peut le vérifier avec la commande ci-dessous. Cela permettra de voir qu'il est bien actif.

sudo systemctl status nginx

Pour que notre serveur Web Nginx démarre automatiquement lorsque la machine Linux démarre ou redémarre, on doit exécuter la commande suivante :

sudo systemctl enable nginx

Dès à présent, on peut accéder à la page par défaut du serveur Web à partir d'un navigateur. Si votre machine où est installé Nginx dispose d'une interface graphique, on peut y accéder en local :

http://127.0.0.1

À partir d'une machine distante, utilisez l'adresse IP de votre serveur Web plutôt que l'adresse de loopback (127.0.0.1). Voici la page qui doit s'afficher :

Le contenu de cette page Web correspond au fichier suivant :

/var/www/html/index.nginx-debian.html

En fait, le site par défaut de Nginx est déclaré dans le fichier de configuration suivant :

/etc/nginx/sites-enabled/default

La racine de ce site est :

/var/www/html

On peut le vérifier grâce à la directive suivante :

root /var/www/html;

Avant de continuer, prenez connaissance des informations suivantes :

  • Le fichier de configuration global de Nginx est :
 /etc/nginx/nginx.conf
  • Le dossier qui contient les fichiers de configuration des sites disponibles est :
/etc/nginx/sites-available/
  • Le dossier qui contient les fichiers de configuration des sites actifs est :
/etc/nginx/sites-enabled/

Lorsque l'on crée la configuration d'un nouveau site, on crée le fichier dans "sites-available" et ensuite lorsque le site est prêt à être activé, on crée un lien symbolique vers "sites-enabled". Cela tombe bien, nous allons créer notre premier site Web dans Nginx : l'occasion de voir ce mécanisme, identique à Apache.

III. Créer un premier site dans Nginx

Nous allons déclarer un nouveau site sur notre serveur Web Nginx. Pour ma part, ce sera le site "it-connect.tech", accessible également avec "www.it-connect.tech". Il sera stocké à l'emplacement suivant : /var/www/it-connect.tech.

Commençons par créer le dossier qui va accueillir notre site Web :

sudo mkdir /var/www/it-connect.tech

Ensuite, on va déclarer l'utilisateur www-data comme propriétaire de ce dossier. Il s'agit de l'utilisateur par défaut de Nginx (correspondant à la propriété "user www-data" du fichier nginx.conf).

sudo chown -R www-data:www-data /var/www/it-connect.tech/

On va définir les droits de ce dossier :

sudo chmod 755 /var/www/it-connect.tech/

Ensuite, c'est le moment de créer notre fichier "index.html" : cela correspond à la page d'accueil de notre site Web.

sudo nano /var/www/it-connect.tech/index.html

Dans ce fichier, insérez le code suivant :

<html>
<head></head>
<body>
<h1>Bienvenue sur IT-Connect !</h1>
</body>
</html>

Enregistrez et fermez le fichier. Il est temps maintenant de créer le fichier de configuration de notre site Internet. Dans le dossier "sites-available", on va créer le fichier "it-connect.tech" : grâce à ce nom, il sera facilement identifiable.

sudo nano /etc/nginx/sites-available/it-connect.tech

Dans ce fichier, intégrez la configuration suivante :

server {

    listen 80;
    listen [::]:80;

    root /var/www/it-connect.tech;

    index index.html;
    server_name it-connect.tech www.it-connect.tech;

    location / {
        try_files $uri $uri/ =404;
    }
}

Voici quelques consignes à appliquer quand vous éditez ce fichier, mais aussi pour bien le comprendre :

  • Respectez l'indentation (espace au début des lignes) pour avoir un fichier de configuration lisible facilement
  • Les lignes de type "commentaires" commencent par le caractère "#"
  • Les lignes qui se terminent par ";" correspondent à des directives, c'est-à-dire des options de configuration
  • Le bloc "Server" permet de déclarer un hôte virtuel et à l'intérieur on déclare sa configuration

Maintenant, je vais vous expliquer la signification des différentes directives de la configuration que l'on vient de créer.

listen 80; 
listen [::]:80;

La directive "listen" : la première ligne permet d'indiquer que le serveur Nginx écoute sur toutes ses adresses IPv4, sur le port 80, ce qui correspond au protocole HTTP. La seconde ligne est similaire, mais pour toutes les adresses IPv6 du serveur, toujours sur le port 80.

Pour que le serveur Web écoute seulement sur une adresse IP spécifique du serveur Linux, on pourrait utiliser :

listen 192.168.100.100:80;

En admettant que 192.168.100.100 soit l'adresse IP du serveur Linux.

root /var/www/it-connect.tech;

La directive "root" permet de déclarer la racine du site Internet : en toute logique, on précise la racine que l'on a créée précédemment et où se situe la page index.html.

index index.html;

D'ailleurs, c'est la directive "index" qui permet d'indiquer le nom (ou les noms) des pages par défaut du site. Si l'on définit "index.html", lorsque l'on accède à la racine du site, le serveur Web va chercher à nous présenter le contenu de la page index.html.

server_name it-connect.tech www.it-connect.tech;

La directive "server_name" sert à déclarer le nom de domaine, ou les noms de domaine, concerné par ce bloc "Server". On peut également utiliser une adresse IP. En l'occurrence dans cet exemple, on souhaite que Nginx traite les requêtes qui arrivent sur it-connect.tech et www.it-connect.tech.

location / { 
    try_files $uri $uri/ =404; 
}

Intéressons-nous au dernier bloc de notre fichier de configuration. La directive "location" permet d'indiquer un chemin relatif dans l'URL. En indiquant "/", on cible toutes les requêtes puisqu'une requête commence toujours par "/" après le nom de domaine pour spécifier le chemin vers une page.

Enfin, grâce à la directive "try_files" suivie de $uri et $uri/, nous allons chercher à vérifier l'existence du fichier ou du dossier (d'où le "/") passé en paramètre dans l'URL. La variable $uri reprend automatiquement l'URL saisie par le client qui accède au site. En fait, la règle "try_files $uri $uri/ =404;" permet de retourner une erreur 404 (page introuvable) au client s'il essaie d'accéder à un fichier ou un dossier qui n'existe pas.

Maintenant que vous en savez plus sur la configuration que nous venons de créer, vous pouvez passer à la suite ! 😉

Pour que notre site soit actif et la configuration chargée par Nginx, nous devons créer un lien symbolique : rappelez-vous de l'intérêt du dossier "sites-enabled". Pour créer un lien symbolique et renvoyer "/etc/nginx/sites-enabled/it-connect.tech" vers "/etc/nginx/sites-available/it-connect.tech", voici la commande :

ln -s /etc/nginx/sites-available/it-connect.tech /etc/nginx/sites-enabled/it-connect.tech

On pourrait copier-coller le fichier d'un dossier vers l'autre, mais cela ne serait pas pratique. Grâce à ce lien symbolique, on a qu'un seul fichier à gérer.

Avant de redémarrer le service Nginx, je vous invite à vérifier la syntaxe de la configuration :

sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

C'est tout bon, on peut redémarrer le service Nginx :

sudo systemctl restart nginx

On peut aussi arrêter Nginx et le démarrer, en deux temps :

sudo systemctl start nginx 
sudo systemctl stop nginx

Le site doit être accessible à deux adresses :

http://www.it-connect.tech
http://it-connect.tech

Je n'ai pas abordé la notion d'enregistrement DNS, mais on part du principe que c'est déjà fait de votre côté. Si vous souhaitez tester sans agir sur les enregistrements DNS, vous pouvez modifier le fichier hosts de votre machine Windows ou Linux.

Par exemple, si vous avez une interface graphique sur votre machine Nginx (ce qui sera peut-être le cas sur un lab), vous pouvez modifier le fichier "/etc/hosts" et ajouter la ligne suivante :

0.0.0.0 it-connect.tech www.it-connect.tech

Si vous utilisez une machine distante, remplacez "0.0.0.0" par l'adresse IP de votre machine Linux.

Les fichiers de logs, c'est-à-dire les journaux de Nginx, sont stockés à l'emplacement suivant :

# Log d'accès (toutes les requêtes)
/var/log/nginx/access.log
# Log d'erreurs
/var/log/nginx/error.log

Bien sûr, ils sont consultables avec la commande "tail" pour récupérer les dernières lignes ajoutées :

sudo tail -f /var/log/nginx/access.log 
sudo tail -f /var/log/nginx/error.log

Passons à l'étape suivante pour que Nginx prenne en charge les scripts PHP.

IV. Ajouter PHP à Nginx

Pour utiliser PHP avec un serveur web Nginx, il est obligatoire d'installer PHP-FPM (PHP FastCGI Process Manager) : Nginx lui transférera les requêtes PHP pour qu'elles soient traitées. 

Si l'on installe le paquet "php-fpm" de Debian 10, nous allons récupérer la version 7.3, ce qui n'est pas top. Il vaut mieux récupérer une version plus récente, par exemple PHP-FPM 7.4.X. Pour cela, nous devons agir sur les dépôts de notre machine. Exécutez les commandes suivantes pour ajouter notre nouveau dépôt PPA :

sudo apt-get update

On récupère la clé GPG du dépôt que l'on va ajouter :

sudo apt -y install lsb-release apt-transport-https ca-certificates 
sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg

Enfin, on ajoute le dépôt :

echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/php.list

Il ne reste plus qu'à mettre à jour le cache de paquets et à installer PHP-FPM 7.4 :

sudo apt-get update
sudo apt-get install php7.4-fpm

En complément, et selon ce que vous souhaitez faire sur votre serveur Web Nginx, pensez à installer les extensions PHP qui vont bien (pour MySQL, par exemple).

Nous devons modifier la configuration de notre site :

sudo nano /etc/nginx/sites-available/it-connect.tech

Le bout de configuration suivant doit être ajouté au sein du groupe "Server", à la suite du bloc "location" déclaré précédemment :

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}

Ce qui donne :

Intégration de PHP à Nginx

Grâce à la directive "location ~ \.php$", on peut agir sur le traitement de tous les fichiers PHP. Ce qui est fort intéressant puisque l'on va pouvoir préciser le fichier de configuration (fastcgi-php.conf) et le chemin vers le socket lié à PHP-FPM, c'est-à-dire le chemin vers php7.4-fpm.sock. Si vous utilisez une version différente de PHP-FPM, le chemin devra être adapté.

Lorsque la configuration est prête, enregistrez le fichier et redémarrez le service Nginx. Avant cela, pensez à vérifier qu'il n'y a pas d'erreur de syntaxe :

sudo nginx -t
sudo systemctl restart nginx

V. Vérifier le bon fonctionnement de PHP avec Nginx

Notre serveur Nginx doit être en mesure de gérer l'exécution des scripts PHP. Nous allons le vérifier. Je vous invite à créer un fichier "info.php" à la racine de notre site Web :

sudo nano /var/www/it-connect.tech/info.php

Dans ce fichier, ajoutez le contenu ci-dessous. Pour rappel, la fonction phpinfo() permet d'obtenir un état détaillé de PHP sur un serveur Web.

<?php
phpinfo();
?>

Enregistrez le fichier et tentez d'accéder à la page info.php avec un navigateur. Normalement, vous devez obtenir une page similaire à celle ci-dessous. On peut voir que PHP fonctionne et que j'utilise bien PHP 7.4.

PHP sur un serveur web Nginx
PHP sur un serveur web Nginx

Voilà ! Votre serveur Web sous Nginx est prêt à être utilisé !

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian Burnel

Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.

florian has 3288 posts and counting.See all posts by florian

Laisser un commentaire

Votre adresse e-mail 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.