Installation et configuration de Nginx sur Debian, Ubuntu et Raspberry

installation de nginx sur debian ubuntu et raspberry

Qu’est ce que Nginx ?

Nginx, prononcé comme « engine-ex », est un serveur web open-source qui, depuis son succès initial en tant que serveur web, est maintenant aussi utilisé comme reverse proxy, cache HTTP, et load balancer.

Nginx est conçu pour offrir une faible utilisation de la mémoire et une grande simultanéité. Plutôt que de créer de nouveaux processus pour chaque requête Web, Nginx utilise une approche asynchrone et événementielle où les requêtes sont traitées dans un seul thread.

kinsta.com

Les différents packages diposnibles pour Nginx

Les différents packages disponibles pour Nginx ainsi que leur contenu (tableaux comparatifs publiés sur AskUbuntu par Jamesdlin). Si vous n’êtes pas intéressés vous pouvez passer directement à l’installation

Standard modulesnginx-corenginx-fullnginx-lightnginx-extras
Core✔️✔️✔️✔️
Access✔️✔️✔️✔️
Auth Basic✔️✔️✔️✔️
Auto Index✔️✔️✔️✔️
Browser✔️✔️✔️
Empty GIF✔️✔️✔️✔️
FastCGI✔️✔️✔️✔️
Geo✔️✔️✔️
Limit Connections✔️✔️✔️
Limit Requests✔️✔️✔️
Map✔️✔️✔️✔️
Memcached✔️✔️✔️
Proxy✔️✔️✔️✔️
Referer✔️✔️✔️
Rewrite✔️✔️✔️✔️
SCGI✔️✔️✔️✔️
Split Clients✔️✔️✔️
UWSGI✔️✔️✔️✔️
Optional modulesnginx-corenginx-fullnginx-lightnginx-extras
Addition✔️✔️✔️
Auth Request✔️✔️✔️✔️
Charset✔️✔️✔️✔️
WebDAV✔️✔️✔️✔️
FLV✔️
GeoIP✔️✔️✔️
Gunzip✔️✔️✔️
Gzip✔️✔️✔️✔️
Gzip Precompression✔️✔️✔️✔️
Headers✔️✔️✔️✔️
HTTP/2✔️✔️✔️✔️
Image Filter✔️✔️✔️
Index✔️✔️✔️✔️
Log✔️✔️✔️✔️
MP4✔️
Embedded Perl✔️
Random Index✔️
Real IP✔️✔️✔️✔️
Slice✔️✔️✔️✔️
Secure Link✔️
SSI✔️✔️✔️✔️
SSL✔️✔️✔️✔️
SSL Preread✔️✔️✔️
Stub Status✔️✔️✔️✔️
Substitution✔️✔️✔️
Thread Pool✔️✔️✔️✔️
Upstream✔️✔️✔️✔️
User ID✔️✔️✔️
XSLT✔️✔️✔️
Mail modulesnginx-corenginx-fullnginx-lightnginx-extras
Mail Core✔️✔️✔️
Auth HTTP✔️✔️✔️
Proxy✔️✔️✔️
SSL✔️✔️✔️
IMAP✔️✔️✔️
POP3✔️✔️✔️
SMTP✔️✔️✔️
Streamnginx-corenginx-fullnginx-lightnginx-extras
Stream Core✔️✔️✔️
GeoIP✔️✔️✔️
GeoIP2✔️✔️
Third-party modulesnginx-corenginx-fullnginx-lightnginx-extras
Auth PAM✔️✔️
Cache Purge✔️
DAV Ext✔️✔️
Echo✔️✔️✔️
Fancy Index✔️
GeoIP2✔️✔️
Headers More✔️
Embedded Lua✔️
HTTP Substitutions✔️✔️
Nchan✔️
Upload Progress✔️
Upstream Fair Queue✔️✔️

Installation de Nginx

Suivant le package que vous avez choisi, changez nginx par nginx-full, nginx-extras etc.

sudo apt install nginx

On vérifie que le service est bien actif

systemctl status nginx
 Output
 ● nginx.service - A high performance web server and a reverse proxy server
    Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
    Active: active (running) since Fri 2020-04-20 16:08:19 UTC; 3 days ago
      Docs: man:nginx(8)
  Main PID: 2369 (nginx)
     Tasks: 2 (limit: 1153)
    Memory: 3.5M
    CGroup: /system.slice/nginx.service
            ├─2369 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
            └─2380 nginx: worker process

Si le processus est bien « active » ouvrez votre navigateur et rendez vous sur l’IP de votre serveur. Localhost si vous êtes en local, ou l’IP du serveur distant

http://votre_ip

Vous devriez arriver sur cette page

Page par défaut de Nginx fresh install

Ajouter un site avec Nginx

Nous allons créer le dossier qui contiendra les fichiers de notre site web.

sudo mkdir -p /var/www/votre_site/

Donnez les droits sur le dossier à Nginx. Attention, suivant la version de Nginx utilisée, il se peut que l’utilisateur ne s’appelle pas www-data. Pour vérifier :

cat /etc/nginx/nginx.conf | grep user
Output :
user www-data;
sudo chown -R www-data:www-data /var/www/votre_site/

Créez une page index.html pour tester

nano /var/www/votre_site/index.html

Ajoutez ce code dans votre index

<html>
    <head>
        <title>Bienvenue sur votre_site !</title>
    </head>
    <body>
        <h1>Felicitations !  Votre virtualhost fonctionne correctement</h1>
    </body>
</html>

Vous venez de créer votre première page web, mais celle-ci n’est pas encore accessible. Nous devons maintenant créer un virstualhost.

Créer un virtualhost Nginx

Pour qu’un serveur web puisse répondre lorsque l’on souhaite voir une page web, il faut lui donner un certain nombre d’informations pour qu’il puisse servir les données demandées. Le fichier qui contient ces données est un virtualhost

sudo nano /etc/nginx/sites-available/votre_site

On va maintenant indiquer les informations de base à Nginx pour qu’il puisse trouver le dossier de votre nouveau site

server {
        listen 80;
        listen [::]:80;

        root /var/www/votre_site;
        index index.html index.htm index.nginx-debian.html;

        server_name votre_domaine www.votre_domaine; #Vous pouvez mettre une adresse IP au lieu d'un domaine

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

Pour que Nginx lise le virtualhost, nous allons créer un lien symbolique (raccourci si vous préférez) vers le dossier sites-enabled

sudo ln -s /etc/nginx/sites-available/votre_site /etc/nginx/sites-enabled/votre_site

On doit maintenant redémarrer Nginx pour qu’il lise le virtualhost nouvellement ajouté au dossier sites-enabled. On peut dans un premier temps vérifié qu’il n’y a pas d’erreurs de syntaxe avec

sudo nginx -t

Normalement si vous avez suivi ce tutoriel à la lettre vous devriez avoir ceci en réponse :

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

On redémarre

sudo systemctl restart nginx

À noter que reload permet de recharger les fichiers de configuration sans redémarrer le service. D’expérience, il arrive dans de rares cas, que ça ne suffise pas, d’où l’utilisation de restart pour assurer le chargement des modifications dans les fichiers de configuration.

sudo systemctl reload nginx

Si vous souhaitez seulement afficher des fichiers HTML/CSS/JS vous pouvez vous arrêter ici. Je vais maintenant continuer pour l’installation de PHP.

Mise en place de PHP 8.2 avec Nginx

Nous allons maintenant faire en sorte que Nginx lise les fichiers PHP. La procédure d’installation est la même que pour avec Apache.

On commence par ajouter le repo

Note : Sur Debian 12 le package PHP est déjà à la version 8.2, vous pouvez donc passer à l’installation directement

sudo apt install apt-transport-https lsb-release ca-certificates curl wget -y
sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
sudo sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
sudo apt update

On met à jour la liste des packages et on installe PHP 8.2 avec la package FPM

sudo apt update
sudo apt install php8.2-{mysql,cli,common,imap,ldap,xml,fpm,curl,mbstring,zip}

Contrairement à Apache qui intègre l’interpréteur PHP, Nginx nécessite un programme externe pour gérer le traitement PHP et agir comme un pont entre l’interpréteur PHP lui-même et le serveur Web. Cela permet d’obtenir de meilleures performances globales pour la plupart des sites Web basés sur PHP, mais cela nécessite une configuration supplémentaire. Vous devrez installer php-fpm, qui signifie « gestionnaire de processus PHP fastCGI« , et indiquer à Nginx de transmettre les requêtes PHP à ce service pour qu’il les traite. Nous avons aussi besoin de php-mysql, un module PHP qui permet à PHP de communiquer avec les bases de données MySQL.

Nous devons donc indiquer à Nginx où envoyer les pages PHP pour que celles-ci soient interprétées. Nous allons dont ajouter un bloc à notre virtualhost

sudo nano /etc/nginx/sites-available/votre_site
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
     }

Ce qui nous donne maintenant

server {
        listen 80;
        listen [::]:80;

        root /var/www/votre_site;
        index index.html index.htm index.nginx-debian.html;

        server_name votre_domaine www.votre_domaine; #Vous pouvez mettre une adresse IP au lieu d'un domaine

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

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

Nous allons aussi ajouter index.php à la ligne index. L’ordre compte ! (voir à la fin de cet article)

  index index.html index.php index.htm index.nginx-debian.html;

On redémarre Nginx

sudo systemctl restart nginx

On vérifie maintenant que notre configuration pour PHP fonctionne correctement, on va donc créer un fichier info.php

sudo nano /var/www/html/info.php
<?php phpinfo(); ?>

Rendez-vous sur la page info.php pour voir ce que ça donne

Le screen ci-dessous a été pris lors de la rédaction originale de cette article, c’est pourquoi la version indiquée est 8.0

C’est fini pour la mise en place de PHP ! Vous pouvez désormais mettre vos fichiers PHP en ligne ! Pensez à supprimer le fichier info.php. S’il est accessible depuis internet, il peut donner de précieuses informations à d’éventuels pirates.

sudo rm /var/www/votre_site/info.php

Explications sur les éléments des virtualhosts de Nginx

  • listen —Définit le port sur lequel Nginx va écouter. Dans ce cas, il écoutera sur le port 80, le port par défaut pour HTTP
  • root — Définit la racine du document où sont stockés les fichiers servis par ce site Web.
  • index — Définit l’ordre dans lequel Nginx donnera la priorité aux fichiers d’index pour ce site Web. Il est courant d’accorder une priorité plus élevée aux fichiers index.html qu’aux fichiers index.php afin de permettre la mise en place rapide d’une page de destination de maintenance dans les applications PHP. Vous pouvez ajuster ces paramètres pour mieux répondre aux besoins de votre application.
  • server_name — Définit les noms de domaine et/ou les adresses IP pour lesquels ce bloc serveur doit répondre. Faites pointer cette directive vers le nom de domaine ou l’adresse IP publique de votre serveur.
  • location / — Le premier bloc de localisation comprend une directive try_files, qui vérifie l’existence de fichiers ou de répertoires correspondant à une requête URI. Si Nginx ne trouve pas la ressource appropriée, il renvoie une erreur 404.
  • location ~ \.php$ — Ce bloc d’emplacement gère le traitement PHP réel en faisant pointer Nginx vers le fichier de configuration fastcgi-php.conf et le fichier php8.2-fpm.sock, qui déclare quelle socket est associée à php-fpm.
  • location ~ /\.ht — Le dernier bloc d’emplacement concerne les fichiers .htaccess, que Nginx ne traite pas. En ajoutant la directive deny all, si des fichiers .htaccess se retrouvent dans la racine du document, ils ne seront pas servis aux visiteurs.

C’est fini pour l’installation et la configuration de Nginx. Je reviens bientôt pour vous expliquer comment mettre en place en place un reverse proxy avec Nginx et comment créer un certificat TLS pour passer notre site en HTTPS. Pour mettre en place la compression avec Brotli c’est par ici !

5/5 - (20 votes)

Laisser un commentaire

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

Articles de la même catégorie

Retour en haut