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 modules | nginx-core | nginx-full | nginx-light | nginx-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 modules | nginx-core | nginx-full | nginx-light | nginx-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 modules | nginx-core | nginx-full | nginx-light | nginx-extras |
---|---|---|---|---|
Mail Core | ✔️ | ✔️ | ✔️ | |
Auth HTTP | ✔️ | ✔️ | ✔️ | |
Proxy | ✔️ | ✔️ | ✔️ | |
SSL | ✔️ | ✔️ | ✔️ | |
IMAP | ✔️ | ✔️ | ✔️ | |
POP3 | ✔️ | ✔️ | ✔️ | |
SMTP | ✔️ | ✔️ | ✔️ |
Stream | nginx-core | nginx-full | nginx-light | nginx-extras |
---|---|---|---|---|
Stream Core | ✔️ | ✔️ | ✔️ | |
GeoIP | ✔️ | ✔️ | ✔️ | |
GeoIP2 | ✔️ | ✔️ |
Third-party modules | nginx-core | nginx-full | nginx-light | nginx-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
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 HTTProot
— 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 !
2 réflexions sur “Installation et configuration de Nginx sur Debian, Ubuntu et Raspberry”
Bonjour,
Très belle qualité d’article… Merci beaucoup.
Savez-vous quand vous proposerez l’article sur la mise en place d’un serveur reverse proxy avec nginx et la création d’un certificats TLS pour passer le site nginx en HTTPS?
Bonjour,
Merci pour votre commentaire.
Vous trouverez l’article sur nginx en reverse proxy ici et celui sur la création de certificat TLS ici