Aller au contenu

Nginx : sites virtuels

Un site virtuel est un bloc server : plusieurs sites peuvent partager un serveur et une adresse IP. Les exemples utilisent des noms génériques.

/etc/nginx/sites-available/exemple.com :

server {
listen 80;
listen [::]:80;
server_name exemple.com www.exemple.com;
root /var/www/exemple.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Fenêtre de terminal
sudo ln -s /etc/nginx/sites-available/exemple.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

Un fichier par site, avec son propre server_name :

server {
listen 80;
server_name blog.exemple.com;
root /var/www/blog;
}
server {
listen 80;
server_name boutique.exemple.com;
root /var/www/boutique;
}

Nginx choisit le site d’après l’en-tête Host de la requête. Les DNS de chaque nom doivent pointer vers le serveur.

# www vers le domaine nu
server {
listen 80;
server_name www.exemple.com;
return 301 http://exemple.com$request_uri;
}
# Une ancienne page vers une nouvelle
location = /ancienne-page {
return 301 /nouvelle-page;
}
# Un dossier entier
location /ancien/ {
rewrite ^/ancien/(.*)$ /nouveau/$1 permanent;
}
Code Usage
301 Redirection permanente (mise en cache par les navigateurs et moteurs de recherche)
302 Redirection temporaire

La redirection de HTTP vers HTTPS est décrite dans HTTPS et certificats.

server {
root /var/www/exemple.com;
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /404.html {
internal; # accessible seulement par redirection interne
}
}

Le code de réponse reste 404 : bon pour le référencement.

Renvoie index.html pour toutes les routes gérées côté navigateur :

server {
root /var/www/application;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
location /assets/ {
try_files $uri =404; # les fichiers manquants restent des 404
}
}
location /telechargements/ {
alias /var/www/fichiers/;
autoindex on;
autoindex_exact_size off; # tailles lisibles (Ko, Mo)
autoindex_localtime on;
}
Fenêtre de terminal
sudo apt install php-fpm
ls /run/php/ # nom du socket : php8.3-fpm.sock (24.04), php8.5-fpm.sock (26.04)
server {
root /var/www/exemple.com;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock; # adapter à la version installée
}
location ~ /\.ht {
deny all;
}
}

Le fragment snippets/fastcgi-php.conf est fourni par Ubuntu (paramètres FastCGI courants).

Pour ne servir aucun contenu aux requêtes qui visent une adresse IP ou un nom inconnu :

server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 444;
}

Retirer ou désactiver le site default livré avec Nginx (sudo rm /etc/nginx/sites-enabled/default) avant de déclarer son propre serveur par défaut.

Fenêtre de terminal
curl -I -H "Host: exemple.com" http://127.0.0.1/
curl --resolve exemple.com:80:127.0.0.1 http://exemple.com/
Symptôme Piste
Le mauvais site s’affiche server_name incorrect : le bloc default_server répond. sudo nginx -T | grep server_name
conflicting server name … ignored Le même server_name est déclaré deux fois
403 Forbidden Droits (www-data), absence d’index, ou autoindex off sur un dossier sans fichier d’index
404 sur des routes d’application monopage Ajouter try_files … /index.html
502 Bad Gateway avec PHP Mauvais nom de socket PHP-FPM, ou service arrêté (systemctl status php8.3-fpm)