Introduction
Nginx peut servir directement des fichiers statiques comme les fichiers html, css, png, etc. Cette arcticle va décrire comment Nginx les sert, comment configurer les fichiers index et comment régler Nginx pour avoir de la performance optimale.
Dossier racine et fichiers index
La directive root
spécifie le dossier racine qui est utiliser pour chercher un fichier. Pour obtenir le chemin du fichier demandé, Nginx
ajoute l'URI de la requête avec le dossier racine. La directive root
peut placer dans toutes les profondeurs de http {}
, server {}
ou location {}
.
La directive index
spécifie le fichier index qui est utiliser lorsque l'URI de la requête se termine par un slash /
. Si l'URI se termine par un
slash /
mais le fichier index est introuvable, Nginx retourne une page 404 (Not Found). Le fichier index par défaut est index.html
.
server {
root /www/uploads;
#on peut aussi définir plusieurs fichiers index.
index index.html index.htm;
location / {
#On peut altérer le fichier index.
index index.html;
}
location /images/ {
#Si l'URI de la requête est "/images/hero.png", Nginx récupère le fichier "/www/uploads/images/hero.png".
}
location ~ \.(mp3|mp4) {
#La redéfinition de "root" altère le "root" précédemment.
#Si l'URI de la requête est "/hd/video.mp4", Nginx récupère le fichier "/www/media/hd/video.mp4".
root /www/media;
}
}
Vérifier l'existance du fichier demandé
La directive try_files
de Nginx permet de vérifier si le fichier ou le dossier demander existe ou non.
location / {
#la variable $uri contient l'URI de la requête.
#Nginx teste le premier paramètre, si le premier n'existe pas, il teste le second et ainsi de suite.
#Dans cette exemple, si aucun paramètre existe, il retourne une page 404.
try_files $uri $uri/ $uri.html =404;
}
Optimisation la performance de la diffusion du contenu
L'optimisation est déjà présente dans la configuration générale de nginx nginx.conf
. Il y a ces 4 lignes dans ce fichier:
http {
#...
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
}
Par défaut, Nginx copie d'abord les fichiers dans une mémoire tampon avant de les envoyer. La directive sendfile
dit à Nginx de
sauter cette étape et d'envoyer directement le fichier.
La directive tcp_nopush
permet à Nginx d'envoyer les entêtes de la réponse dans un seul paquet juste après le bloc de données a été
obtenu par sendfile()
. Pour cela, on ne peut pas activer cette option que si sendfile
est utilisée.
Par défaut, Nginx regroupe un certain nombre de petits paquets en plus grand et envoie le paquet avec un retard de 200 ms. Cela résout
le ralentissement causé par le nombre important de requêtes avec une connexion plus lente mais pour envoyer des fichiers statiques volumeux,
ce n'est pas nécessaire. La directive tcp_nodelay
désactive ce comportement là et la connexion persistant (keepalive connection) doit être
utiliser avec elle.