Servir des contenus statiques avec Nginx (html, css, png, ...)

06 avril 2022
Server
Nginx
Servir des contenus statiques avec Nginx (html, css, png, ...) - Banner

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.