Comment installer Nginx avec des hôtes virtuels et un certificat SSL
Nginx (abréviation de Engine-x) est un serveur HTTP et reverse proxy gratuit, open source, puissant, performant et évolutif, un serveur proxy TCP/UDP standard et de messagerie. Il est facile à utiliser et à configurer, avec un langage de configuration simple. Nginx est désormais le logiciel de serveur Web préféré pour alimenter des sites lourdement chargés, en raison de son évolutivité et de ses performances.
Dans cet article, nous verrons comment utiliser Nginx en tant que serveur HTTP, le configurer pour servir du contenu Web, configurer des hôtes virtuels basés sur le nom, et créer et installer SSL pour des transmissions de données sécurisées, y compris un certificat auto-signé sur Ubuntu et CentOS.
Comment installer Nginx Web Server
Commencez par installer le paquet Nginx à partir des dépôts officiels en utilisant votre gestionnaire de paquets, comme indiqué.
------------ On Ubuntu ------------
sudo apt update
sudo apt install nginx
------------ On CentOS ------------
sudo yum update
sudo yum install epel-release
sudo yum install nginx
Une fois le package Nginx installé, vous devez démarrer le service pour l’instant, l’activer pour qu’il démarre automatiquement au démarrage et afficher son état, à l’aide des commandes suivantes. Notez que sur Ubuntu, il doit être démarré et activé automatiquement pendant que le paquet est préconfiguré.
$ sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx
À ce stade, le serveur web Nginx doit être opérationnel, vous pouvez vérifier l’état avec la commande netstat.
$ sudo netstat -tlpn | grep nginx
Si votre système dispose d’un pare-feu activé, vous devez ouvrir les ports 80 et 443 pour autoriser le trafic HTTP et HTTPS respectivement, à travers celui-ci, en l’exécutant.
------------ On CentOS ------------
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --reload
------------ On Ubuntu ------------
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload
La méthode idéale pour tester l’installation de Nginx et vérifier s’il est en cours d’exécution et capable de servir des pages Web est d’ouvrir un navigateur Web et de pointer vers l’adresse IP du serveur.
http://Your-IP-Address
OR
http://Your-Domain.com
Une installation fonctionnelle doit être indiquée par l’écran suivant.
Comment configurer le serveur Web Nginx
Les fichiers de configuration de Nginx se trouvent dans le répertoire /etc/nginx et le fichier de configuration global se trouve dans /etc/nginx/nginx.conf sur CentOS et Ubuntu.
Nginx est composé de modules qui sont contrôlés par diverses options de configuration, appelées directives. Une directive peut être simple (sous la forme name et les valeurs terminées par un ;) ou block ( a des instructions supplémentaires entourées de {}). Et une directive de bloc qui contient d’autres directives s’appelle un contexte.
Toutes les directives sont expliquées en détail dans la documentation Nginx sur le site web du projet. Vous pouvez vous y référer pour plus d’informations.
Comment diffuser du contenu statique à l’aide de Nginx en mode autonome
À un niveau fondamental, Nginx peut être utilisé pour servir du contenu statique tel que des fichiers HTML et multimédias, en mode autonome, où seul le bloc de serveur par défaut est utilisé (analogue à Apache où aucun hôte virtuel n’a été configuré).
Nous commencerons par expliquer brièvement la structure de configuration dans le fichier de configuration principal.
sudo vim /etc/nginx/nginx.conf
Si vous regardez dans ce fichier de configuration Nginx, la structure de configuration devrait apparaître comme suit et c’est ce qu’on appelle le contexte principal, qui contient de nombreuses autres directives simples et block. Tout le trafic Web est géré dans le contexte http.
user nginx;
worker_processes 1;
.....
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
.....
events {
.....
}
http {
server{
…….
}
.....
}
Ce qui suit est un exemple de fichier de configuration principale de Nginx (/etc/nginx/nginx.conf), où le bloc http ci-dessus contient une directive include qui indique à Nginx où trouver les fichiers de configuration de site Web (configurations d’hôtes virtuels).
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
Notez que sur Ubuntu, vous trouverez également une directive include supplémentaire (include /etc/nginx/sites-enabled/* ;), où le répertoire /etc/nginx/sites-enabled/ stocke des liens symboliques vers les fichiers de configuration des sites Web créés dans /etc/nginx/sites-available/, pour activer les sites. Et la suppression d’un lien symbolique désactive ce site particulier.
En fonction de votre source d’installation, vous trouverez le fichier de configuration de site Web par défaut à l’adresse /etc/nginx/conf.d/default.conf (si vous l’avez installé à partir du référentiel officiel NGINX et EPEL) ou /etc/nginx/sites-enabled/default (si vous l’avez installé à partir des référentiels Ubuntu).
Il s’agit de notre exemple de bloc de serveur nginx par défaut situé dans /etc/nginx/conf.d/default.conf sur le système de test.
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /var/www/html/;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Une brève explication des directives dans la configuration ci-dessus :
- Listen : spécifie le port sur lequel le serveur écoute.
- server_name : définit le nom du serveur qui peut être des noms exacts, des noms génériques ou des expressions régulières.
- root : spécifie le répertoire à partir duquel Nginx servira les pages web et autres documents.
- index : spécifie le(s) type(s) de fichier(s) d’index à servir.
- Emplacement : Utilisé pour traiter les demandes de fichiers et de dossiers spécifiques.
À partir d’un navigateur Web, lorsque vous pointez sur le serveur à l’aide du nom d’hôte localhost ou de son adresse IP, il traite la requête et sert le fichier /var/www/html/index.html, et enregistre immédiatement l’événement dans son journal d’accès (/var/log/nginx/access.log) avec une réponse de 200 (OK). En cas d’erreur (événement ayant échoué), il enregistre le message dans le journal des erreurs (/var/log/nginx/error.log).
Pour en savoir plus sur la journalisation dans Nginx, vous pouvez vous référer à Comment configurer l’accès personnalisé ou les formats de journal d’erreurs dans Nginx.
Au lieu d’utiliser les fichiers journaux par défaut, vous pouvez définir des fichiers journaux personnalisés pour différents sites Web, comme nous le verrons plus tard, dans la section « Configuration d’hôtes virtuels basés sur le nom (blocs de serveurs) ».
Comment restreindre l’accès à une page Web avec Nginx
Afin de restreindre l’accès à votre site web/application ou à certaines parties de celui-ci, vous pouvez configurer l’authentification HTTP de base. Cela peut être utilisé essentiellement pour restreindre l’accès à l’ensemble du serveur HTTP, à des blocs de serveurs individuels ou à des blocs d’emplacement.
Commencez par créer un fichier qui stockera vos identifiants d’accès (nom d’utilisateur/mot de passe) à l’aide de l’utilitaire htpasswd.
yum install httpd-tools #RHEL/CentOS
sudo apt install apache2-utils #Debian/Ubuntu
À titre d’exemple, ajoutons l’utilisateur admin à cette liste (vous pouvez ajouter autant d’utilisateurs que possible), où l’option -c est utilisée pour spécifier le fichier de mot de passe, et l’option -B pour chiffrer le mot de passe. Une fois que vous avez cliqué sur [Entrée], il vous sera demandé d’entrer le mot de passe de l’utilisateur :
$ sudo htpasswd -Bc /etc/nginx/conf.d/.htpasswd admin
Ensuite, attribuons les autorisations et la propriété appropriées au fichier de mot de passe (remplaçons l’utilisateur et le groupe nginx par www-data sur Ubuntu).
$ sudo chmod 640 /etc/nginx/conf.d/.htpasswd
sudo chown nginx:nginx /etc/nginx/conf.d/.htpasswd
Comme nous l’avons mentionné précédemment, vous pouvez restreindre l’accès à votre serveur Web, à un seul site Web (à l’aide de son bloc serveur) ou à un répertoire ou à un fichier spécifique. Deux directives utiles peuvent être utilisées pour y parvenir :
- auth_basic – active la validation du nom d’utilisateur et du mot de passe à l’aide du protocole « Authentification de base HTTP ».
- auth_basic_user_file – spécifie le fichier des informations d’identification.
À titre d’exemple, nous allons montrer comment protéger par mot de passe le répertoire /var/www/html/protected.
server {
listen 80 default_server;
server_name localhost;
root /var/www/html/;
index index.html;
location / {
try_files $uri $uri/ =404;
}
location /protected/ {
auth_basic "Restricted Access!";
auth_basic_user_file /etc/nginx/conf.d/.htpasswd;
}
}
Maintenant, enregistrez les modifications et redémarrez le service Nginx.
$ sudo systemctl restart nginx
La prochaine fois que vous pointerez votre navigateur sur le répertoire ci-dessus (http://localhost/protected), il vous sera demandé d’entrer vos identifiants de connexion (nom d’utilisateur admin et le mot de passe choisi).
Une connexion réussie vous permet d’accéder au contenu de l’annuaire, sinon vous obtiendrez une erreur « Autorisation 401 requise ».
Comment configurer des hôtes virtuels basés sur le nom (blocs de serveur) dans Nginx
Le contexte de serveur permet de stocker et de servir plusieurs domaines/sites à partir de la même machine physique ou d’un serveur privé virtuel (VPS). Plusieurs blocs de serveur (représentant des hôtes virtuels) peuvent être déclarés dans le contexte http pour chaque site/domaine. Nginx décide quel serveur traite une requête en fonction de l’en-tête de la requête qu’il reçoit.
Nous allons démontrer ce concept à l’aide des domaines factices suivants, chacun situé dans le répertoire spécifié :
- wearelinux-console.net – /var/www/html/wearelinux-console.net/
- welovelinux.com – /var/www/html/welovelinux.com/
Ensuite, attribuez les autorisations appropriées dans l’annuaire pour chaque site.
$ sudo chmod -R 755 /var/www/html/wearelinux-console.net/public_html
sudo chmod -R 755 /var/www/html/welovelinux.com/public_html
Maintenant, créez un exemple de fichier index.html à l’intérieur de chaque répertoire public_html.
<html>
<head>
<title>www.wearelinux-console.net</title>
</head>
<body>
<h1>This is the index page of www.wearelinux-console.net</h1>
</body>
</html>
Ensuite, créez les fichiers de configuration du bloc de serveur pour chaque site dans le répertoire /etc/httpd/conf.d.
$ sudo vi /etc/nginx/conf.d/wearelinux-console.net.conf
sudo vi /etc/nginx/conf.d/welovelinux.com.conf
Ajoutez la déclaration de bloc de serveur suivante dans le fichier wearelinux-console.net.conf.
server {
listen 80;
server_name wearelinux-console.net;
root /var/www/html/wearelinux-console.net/public_html ;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Ensuite, ajoutez la déclaration de bloc de serveur suivante dans le fichier welovelinux.com.conf.
server {
listen 80;
server_name welovelinux.com;
root /var/www/html/welovelinux.com/public_html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Pour appliquer les modifications récentes, redémarrez le serveur Web Nginx.
$ sudo systemctl restart nginx
Et pointer votre serveur web vers les adresses ci-dessus devrait vous faire voir les pages principales des domaines factices.
http://wearelinux-console.net
http://welovelinux.com
Important : Si vous avez activé SELinux, sa configuration par défaut ne permet pas à Nginx d’accéder aux fichiers en dehors des emplacements autorisés bien connus (tels que /etc/nginx pour les configurations, /var/log/nginx pour les journaux, /var/www/html pour les fichiers web, etc.).
Vous pouvez gérer cela en désactivant SELinux ou en définissant le contexte de sécurité correct. Pour plus d’informations, reportez-vous à ce guide : utilisation de Nginx et Nginx Plus avec SELinux sur le site Nginx Plus.
Comment installer et configurer SSL avec Nginx
Les certificats SSL permettent d’activer le protocole HTTP sécurisé (HTTPS) sur votre site, ce qui est essentiel pour établir une connexion fiable/sécurisée entre les utilisateurs finaux et votre serveur en chiffrant les informations transmises vers, depuis ou au sein de votre site.
Nous verrons comment créer et installer un certificat auto-signé, et générer une demande de signature de certificat (CSR) pour acquérir un certificat SSL auprès d’une autorité de certification (CA), à utiliser avec Nginx.
La création de certificats auto-signés est gratuite et peut être utilisée à des fins de test et pour les services internes LAN uniquement. Pour les serveurs publics, il est fortement recommandé d’utiliser un certificat émis par une autorité de certification (par exemple Let’s Encrypt) pour garantir son authenticité.
Pour créer un certificat auto-signé, créez d’abord un répertoire dans lequel vos certificats seront stockés.
$ sudo mkdir /etc/nginx/ssl-certs/
Générez ensuite votre certificat auto-signé et la clé à l’aide de l’outil de ligne de commande openssl.
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl-certs/nginx.key -out /etc/nginx/ssl-certs/nginx.crt
Décrivons brièvement les options utilisées dans la commande ci-dessus :
- req -X509 – indique que nous créons un certificat X509.
- -nodes (NO DES) – signifie « ne pas chiffrer la clé ».
- -days 365 – spécifie le nombre de jours pendant lesquels le certificat sera valide.
- -newkey rsa :2048 – spécifie que la clé générée à l’aide de l’algorithme RSA doit être de 2048 bits.
- -keyout /etc/nginx/ssl-certs/nginx.key – spécifie le chemin complet de la clé RSA.
- -out /etc/nginx/ssl-certs/nginx.crt – spécifie le chemin complet du certificat.
Ensuite, ouvrez le fichier de configuration de votre hôte virtuel et ajoutez les lignes suivantes à une déclaration de bloc de serveur écoutant sur le port 443. Nous allons tester avec le fichier hôte virtuel /etc/nginx/conf.d/wearelinux-console.net.conf.
$ sudo vi /etc/nginx/conf.d/wearelinux-console.net.conf
Ajoutez ensuite la directive ssl au fichier de configuration nginx, elle devrait ressembler à ci-dessous.
server {
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
ssl on;
ssl_certificate /etc/nginx/ssl-certs/nginx.crt;
ssl_trusted_certificate /etc/nginx/ssl-certs/nginx.crt;
ssl_certificate_key /etc/nginx/ssl-certs/nginx.key;
server_name wearelinux-console.net;
root /var/www/html/wearelinux-console.net/public_html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Redémarrez maintenant le Nginx et pointez votre navigateur vers l’adresse suivante.
https://www.wearelinux-console.net
Si vous souhaitez acheter un certificat SSL auprès d’une autorité de certification, vous devez générer une demande de signature de certificat (CSR) comme indiqué.
$ sudo openssl req -newkey rsa:2048 -nodes -keyout /etc/nginx/ssl-certs/example.com.key -out /etc/nginx/ssl-certs/example.com.csr
Vous pouvez également créer une CSR à partir d’une clé privée existante.
$ sudo openssl req -key /etc/nginx/ssl-certs/example.com.key -new -out /etc/nginx/ssl-certs/example.com.csr
Ensuite, vous devez envoyer la demande de signature de certificat générée à une autorité de certification pour demander l’émission d’un certificat SSL signé par une autorité de certification. Une fois que vous avez reçu votre certificat de l’autorité de certification, vous pouvez le configurer comme indiqué ci-dessus.
Lire aussi : Le guide ultime pour sécuriser, renforcer et améliorer les performances du serveur Web Nginx
Résumé
Dans cet article, nous avons expliqué comment installer et configurer Nginx ; a abordé la configuration d’un hébergement virtuel basé sur le nom avec SSL pour sécuriser les transmissions de données entre le serveur Web et un client.
Si vous avez rencontré des problèmes lors de votre processus d’installation/configuration de nginx ou si vous avez des questions ou des commentaires, utilisez le formulaire de commentaires ci-dessous pour nous joindre.






