Sécuriser nginx
nginx est l'un des deux serveurs web les plus utilisés au monde : il équipe 30,8 % des sites dont le serveur est connu, juste derrière Cloudflare Server (31,1 %) (30 septembre 2026). Comme il est souvent exposé directement à Internet, il représente une cible privilégiée pour les attaquants. Sécuriser correctement sa configuration est donc une étape cruciale pour protéger ses applications et ses données.
Sources :
- W3Techs - Usage Statistics of Nginx for Websites (septembre 2026)
- W3Techs - Usage statistics of web servers (septembre 2026)
Bonnes pratiques de sécurité
Mises à jour régulières
- Maintenez nginx et l'OS à jour avec les derniers correctifs de sécurité.
- Utilisez des outils comme
unattended-upgrades(Ubuntu/Debian) pour automatiser les mises à jour critiques.
Firewall
- N'autorisez que les ports nécessaires :
- 80 (HTTP) et 443 (HTTPS).
- Bloquez les autres ports sauf si un service en dépend.
- Outils : ufw (simple) ou nftables (avancé).
HTTPS obligatoire
- Activez HTTPS avec un certificat TLS valide.
- Obtenez des certificats gratuits via Let's Encrypt avec Certbot.
-
Redirigez automatiquement HTTP → HTTPS :
server { listen 80; server_name example.com; return 301 https://$host$request_uri; }
En-têtes HTTP de sécurité
Ajoutez des en-têtes pour limiter la surface d'attaque :
add_header Content-Security-Policy "default-src 'self'" always;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Frame-Options "DENY" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "same-origin" always;
add_header Permissions-Policy "geolocation=(), camera=(), microphone=()" always;
- CSP (Content Security Policy) : limite les sources autorisées pour les scripts, styles, images… → protège contre l'injection de scripts malveillants (XSS, Cross-Site Scripting).
- Avec
default-src 'self', seules les ressources du site lui-même sont acceptées : un script ou une police chargés depuis un autre domaine seront bloqués.
- Avec
- HSTS (HTTP Strict Transport Security) : indique au navigateur de n'accéder au site qu'en HTTPS pendant la durée
max-age(ici 2 ans).preloadpermet de demander l'inscription du domaine dans la liste HSTS intégrée aux navigateurs. Une fois inscrit, le retour en arrière est long et difficile.
- X-Frame-Options : interdit l'affichage du site dans un cadre (
<iframe>) d'un autre site → empêche le clickjacking (piège qui fait cliquer l'utilisateur sur un élément caché). - X-Content-Type-Options : oblige le navigateur à respecter le type de contenu annoncé par le serveur (
Content-Type) au lieu de le deviner (MIME sniffing). - Referrer-Policy : contrôle l'envoi de l'URL de la page d'origine (en-tête
Referer). Avecsame-origin, elle n'est transmise qu'à son propre site. - Permissions-Policy : désactive des API navigateur sensibles (ici géolocalisation, caméra et micro).
Note
Le paramètre always ajoute l'en-tête à toutes les réponses, y compris les pages d'erreur. Attention : les directives add_header d'un bloc (http, server) ne sont héritées par un bloc location que si celui-ci ne contient aucune directive add_header.
Source : nginx - Module ngx_http_headers_module (add_header)
Sources :
- MDN Web Docs - Content-Security-Policy
- MDN Web Docs - Strict-Transport-Security
- MDN Web Docs - X-Frame-Options
- MDN Web Docs - X-Content-Type-Options
- MDN Web Docs - Referrer-Policy
- MDN Web Docs - Permissions-Policy
Note
L'en-tête X-XSS-Protection (filtre anti-XSS des anciens navigateurs) est aujourd'hui obsolète : les navigateurs modernes ne le prennent plus en compte et son usage peut même introduire des failles XSS sur des sites autrement sûrs. La protection contre les attaques XSS repose désormais sur la CSP.
Source : MDN Web Docs - X-XSS-Protection
Masquer la version du serveur
Désactivez l'affichage du numéro de version (pages d'erreur et en-tête Server) avec :
server_tokens off;
Le nom « nginx » reste toutefois visible. Pour supprimer complètement l'en-tête Server, installez le module headers-more (paquet libnginx-mod-http-headers-more-filter, également inclus dans nginx-extras) puis utilisez :
http {
more_clear_headers 'Server';
server_tokens off;
}
Sources :
- nginx - Module ngx_http_core_module (server_tokens)
- OpenResty - headers-more-nginx-module (GitHub)
- Ubuntu - Package libnginx-mod-http-headers-more-filter (26.04 LTS)
Limiter les méthodes HTTP
Autorisez uniquement les méthodes nécessaires (HEAD, GET et POST) :
location / {
limit_except GET POST {
deny all;
}
}
Les autres méthodes (PUT, DELETE…) sont refusées avec une erreur 403. À noter : avec nginx, autoriser GET autorise automatiquement HEAD.
Source : nginx - Module ngx_http_core_module (limit_except)
Journalisation et surveillance
- Consultez régulièrement les logs pour détecter des anomalies :
- Access logs :
/var/log/nginx/access.log - Error logs :
/var/log/nginx/error.log
- Access logs :
Tip
Les serveurs web sont une des premières cibles des attaquants !
Sur nginx, les informations de version du serveur se trouvent dans le pied de page des pages d'erreur par défaut et dans l'en-tête Server des réponses HTTP. Masquer ces informations est une bonne pratique pour limiter les informations accessibles aux attaquants.


Attention !
Les modifications dans la configuration du serveur peuvent affecter le bon fonctionnement de vos sites web.
✅ Réfléchissez à ce que vous faites !
✅ Comprenez bien chaque modification !
✅ Documentez-vous avant de changer des paramètres critiques !
✅ Notez les modifications que vous appliquez !
Liens utiles
Pour configurer les en-têtes HTTP :
Pour vérifier les en-têtes HTTP :