Aller au contenu
DEV-TOOL

Générateur de configuration nginx — HTTP/3, WebSocket, sécurité

Assemblez vos server blocks, choisissez un profil TLS, activez HTTP/3 et WebSocket — ou collez un .htaccess pour le convertir automatiquement en directives nginx.

Runs locally in the browser — configs are emitted in memory, nothing is uploaded.

Input mode

Presets

Load a stack, then tweak field by field.

Server block type

TLS profile

Rate-limit profile

Emits zone AND location reference — no orphaned zones.

nginx configuration

# nginx config generated by kittokit nginx-config-generator
# Validate with `nginx -t` before reloading. Validate Content-Security-
# Policy at csp-evaluator.withgoogle.com and HSTS at hstspreload.org.

# WebSocket connection-upgrade map (must be at http{} scope)
map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;
}

# Rate-limit zones — profile "gentle" (must be at http{} scope)
limit_req_zone $binary_remote_addr zone=gentle:10m rate=30r/s;
limit_conn_zone $binary_remote_addr zone=gentle_conn:10m;

# ── Let's Encrypt ACME challenge (webroot mode) ──
server {
  listen 80;
  listen [::]:80;
  server_name example.com www.example.com;

  # Certbot webroot challenge
  location /.well-known/acme-challenge/ {
    root /var/www/certbot;
  }

  # Everything else → HTTPS
  location / {
    return 301 https://$host$request_uri;
  }
}

# DNS-01 challenge (wildcard certs) is also possible — see:
# https://eff-certbot.readthedocs.io/en/stable/using.html#dns-plugins

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  # ── HTTP/3 + QUIC (nginx 1.25+) ──
  listen 443 quic reuseport;
  listen [::]:443 quic reuseport;
  http3 on;
  ssl_early_data on;
  add_header Alt-Svc 'h3=":443"; ma=86400' always;
  server_name example.com www.example.com;

  # ── TLS — Mozilla Modern (TLS 1.3 only) ──
  ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
  ssl_protocols TLSv1.3;
  ssl_prefer_server_ciphers off;
  ssl_session_timeout 1d;
  ssl_session_cache shared:SSL:10m;
  ssl_session_tickets off;
  # OCSP stapling
  ssl_stapling on;
  ssl_stapling_verify on;
  ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
  resolver 1.1.1.1 1.0.0.1 valid=300s;
  resolver_timeout 5s;

  access_log /var/log/nginx/access.log;
  error_log  /var/log/nginx/error.log warn;

  # ── Modern security headers ──
  add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
  add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self'; connect-src 'self'; frame-ancestors 'none'; base-uri 'self'; form-action 'self'" always;
  add_header Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=(), usb=(), magnetometer=(), gyroscope=(), accelerometer=(), interest-cohort=(), browsing-topics=(), fullscreen=(self)" always;
  add_header Cross-Origin-Opener-Policy "same-origin" always;
  add_header Cross-Origin-Resource-Policy "same-origin" always;
  add_header Referrer-Policy "strict-origin-when-cross-origin" always;
  add_header X-Content-Type-Options "nosniff" always;
  add_header X-Frame-Options "DENY" always;

  # ── Compression (gzip + brotli when ngx_brotli is built) ──
  gzip on;
  gzip_vary on;
  gzip_comp_level 6;
  gzip_min_length 256;
  gzip_proxied any;
  gzip_types
    text/plain text/css text/javascript text/xml
    application/javascript application/json application/xml
    application/xml+rss application/atom+xml
    image/svg+xml font/woff2 application/wasm;
  # If you built nginx with ngx_brotli, also:
  # brotli on;
  # brotli_comp_level 6;
  # brotli_types text/plain text/css application/javascript application/json image/svg+xml;

  root /var/www/example.com;
  index index.html;

  # SPA fallback — every unknown route serves index.html
  location / {
    limit_req  zone=gentle burst=50 nodelay;
    limit_conn gentle_conn 100;
    try_files $uri $uri/ /index.html;
  }

  # Long-cache hashed assets
  location ~* \.(?:js|css|woff2?|svg|webp|avif|png|jpg|jpeg)$ {
    expires 1y;
    add_header Cache-Control "public, immutable" always;
  }
}

After deploy validate with `sudo nginx -t` and activate with `sudo systemctl reload nginx`.

Validate Content-Security-Policy at the external evaluator before deploying.

Comment ça marche

  1. 01

    Text oder Code einfügen

    Füge deinen Inhalt in das Eingabefeld ein oder tippe direkt.

  2. 02

    Automatische Verarbeitung

    Das Tool verarbeitet den Inhalt sofort und zeigt das Ergebnis.

  3. 03

    Ergebnis kopieren

    Kopiere das Ergebnis mit einem Klick in die Zwischenablage.

Confidentialité

Alle Berechnungen laufen direkt in deinem Browser. Keine Daten werden auf Server übertragen.

Construisez une configuration nginx bloc par bloc plutôt que d'empiler trois snippets de Stack Overflow. Vous choisissez le type de server block (statique, fallback SPA, reverse-proxy, PHP-FPM, load-balancer, stream TCP/UDP), un profil TLS, activez HTTP/3 + QUIC, l'upgrade WebSocket, des en-têtes de sécurité modernes et un profil de rate-limit. Vous pouvez aussi coller un `.htaccess` existant ; le générateur traduit redirections, rewrites, en-têtes et ErrorDocuments en directives nginx.

01 — Mode d’emploi

Comment utiliser cet outil ?

  1. Choisissez le mode d'entrée : constructeur visuel par blocs ou insertion d'un `.htaccess` à convertir.
  2. Chargez un preset (SPA, reverse-proxy Node, Uvicorn Python, WordPress, HTTPS strict, load-balancer) et ajustez champ par champ.
  3. Choisissez le type de server block, le profil TLS (Modern/Intermediate/Old), activez HTTP/2 et HTTP/3.
  4. Pour les blocs reverse-proxy et load-balancer, activez l'upgrade WebSocket ; choisissez un profil de rate-limit (Gentle, API, Strict).
  5. Copiez la configuration ou téléchargez-la en `nginx.conf`. Validez avec `sudo nginx -t` puis activez par `sudo systemctl reload nginx`.

Que fait le générateur de configuration nginx ?

Le générateur est un éditeur de server blocks nginx. Vous choisissez parmi huit types de bloc (hébergement statique, fallback SPA, reverse-proxy, PHP-FPM, load-balancer, redirection seule, stream TCP, stream UDP), ajustez des champs tels que server_name, root et upstream, et le générateur agence toutes les directives nécessaires dans le bon ordre. Vous pouvez aussi coller un .htaccess existant — le générateur traduit redirections, rewrites, en-têtes et ErrorDocuments en directives nginx. Tout se passe dans le navigateur. Pas de téléversement, pas de compte, pas de bannière de cookies.

Les six presets couvrent les piles les plus fréquentes :

  • SPA — hébergement statique — single-page app avec Astro/SvelteKit/Vite, long-cache pour les assets hashés, fallback sur index.html, HTTP/3 actif.
  • Node.js — reverse-proxy — serveur Node/Bun derrière nginx avec upgrade WebSocket correctement câblé.
  • Python — Uvicorn/ASGI — FastAPI ou Starlette via Uvicorn, rate-limit « API ».
  • WordPress — PHP-FPM — PHP-FPM via socket Unix, wp-config.php et .env verrouillés.
  • HTTPS strict — Audit-A — taillé pour un score A à Mozilla Observatory, TLS 1.3, COOP/COEP/CORP.
  • Load-balancer — least_conn — nginx devant trois nœuds backend, failover de santé via max_fails.

Quels types de server block sont intégrés ?

Huit types, regroupés par cas :

  • Hébergement statiquetry_files $uri $uri/ =404;. Classique pour Hugo, 11ty, HTML pur.
  • Fallback SPAtry_files $uri $uri/ /index.html; plus long-cache pour assets hashés. Standard pour toute app à routage client.
  • Reverse-proxyproxy_pass vers un upstream, avec tous les X-Forwarded-* usuels. Upgrade WebSocket optionnel.
  • PHP-FPMfastcgi_pass vers un socket Unix, avec permaliens try_files et règles deny pour wp-config.php, .env, .git.
  • Load-balancerproxy_pass http://backend_pool; plus le template upstream correspondant (commenté car upstream {} vit hors de server {}).
  • Redirection seulereturn 301 https://www.example.com$request_uri;. Pour les canoniques www et les migrations de domaine.
  • Stream TCP — pour le scope stream {}, par exemple proxying Postgres/Redis. Le bloc commente le changement de scope.
  • Stream UDP — analogue pour DNS ou QUIC-forward.

Comment fonctionne le support HTTP/3 et QUIC ?

HTTP/3 remplace HTTP/2 et utilise QUIC au lieu de TCP comme transport. QUIC est basé sur UDP, intègre TLS au setup de connexion et élimine le head-of-line blocking de HTTP/2. nginx intègre QUIC dans la build officielle depuis la version 1.25 (auparavant seulement dans la branche nginx-quic). Le générateur émet quatre directives dès l’activation de HTTP/3 :

listen 443 quic reuseport;
listen [::]:443 quic reuseport;
http3 on;
ssl_early_data on;
add_header Alt-Svc 'h3=":443"; ma=86400' always;

L’en-tête Alt-Svc signale aux navigateurs que HTTP/3 est disponible sur le port 443 ; ma=86400 met l’information en cache pendant 24 heures. Les navigateurs sans HTTP/3 ignorent l’en-tête et restent sur HTTP/2.

Pourquoi la correction de l’upgrade WebSocket compte ?

Le reverse-proxying WebSocket casse dans la plupart des configs nginx naïves parce que l’upgrade de connexion manque. Le bon motif comporte quatre parties :

  1. Directive map dans le scope http {} — traduit l’en-tête Upgrade envoyé par le client en une valeur Connection adaptée :
    map $http_upgrade $connection_upgrade {
      default upgrade;
      ''      close;
    }
  2. proxy_set_header Upgrade $http_upgrade; — transmet le signal d’upgrade au backend.
  3. proxy_set_header Connection $connection_upgrade; — écrase le Connection: close par défaut que nginx pose en reverse-proxy.
  4. proxy_read_timeout 86400s; — place le read-timeout à 24 heures pour que les WebSockets inactifs ne se coupent pas après 60 secondes (défaut nginx).

Le générateur écrit les quatre automatiquement dès que vous cochez WebSocket dans un bloc reverse-proxy ou load-balancer. C’est le pain-point n°1 des setups WebSocket — et la cause principale des « ma connexion casse sans cesse » sur les forums.

Quels en-têtes de sécurité sont émis ?

Six en-têtes appartiennent à tout bloc nginx moderne (voir les Mozilla Web Security Guidelines) :

  • Strict-Transport-Security — HSTS avec max-age=31536000; includeSubDomains; preload. Preload est actif par défaut, un toggle permet de le couper pour les sous-domaines qui ne fonctionnent pas sans HTTP.
  • Content-Security-Policy — valeur de départ avec default-src 'self', frame-ancestors 'none'. Toggle pour le mode report-only pendant le déploiement.
  • Permissions-Policy — tout désactivé par défaut (camera=(), microphone=(), geolocation=(), payment=(), usb=(), interest-cohort=(), browsing-topics=()).
  • Cross-Origin-Opener-Policysame-origin contre les attaques window.opener.
  • Cross-Origin-Embedder-Policy — optionnel require-corp pour les cas SharedArrayBuffer.
  • Cross-Origin-Resource-Policysame-origin bloque les intégrations cross-origin de vos propres assets.

Chaque en-tête porte le flag always. Sans always, nginx supprime les en-têtes sur les réponses 4xx/5xx — ce que de nombreux outils d’audit (Mozilla Observatory, securityheaders.com) classent comme infraction A. Avant le déploiement, validez votre CSP avec l’évaluateur CSP externe.

Comment fonctionne le profil de rate-limit ?

Le rate-limiting nginx combine deux directives :

  • limit_req_zone dans le scope http {} — réserve la mémoire partagée et définit le débit.
  • limit_req zone=<nom> burst=<n> nodelay; dans le bloc location — référence la zone.

Erreur fréquente des générateurs en ligne publics : la zone est émise, la référence dans location manque — la zone reste totalement inutilisée (voir l’issue ouverte sur le générateur en ligne le plus populaire). Le générateur émet les deux ensemble et injecte la référence dans le premier location du server block. Trois profils :

  • Gentle — 30 r/s, burst 50, limit_conn 100. Pour les sites web avec un vrai trafic utilisateur.
  • API — 10 r/s, burst 20, limit_conn 50. Pour les APIs REST/GraphQL avec throttling sur token.
  • Strict — 5 r/s, burst 10, limit_conn 20. Pour les endpoints de login, les receivers de webhooks, les routes critiques.

burst définit combien de requêtes en plus du débit sont acceptées avant que les 429 ne sortent. nodelay signifie que les requêtes en burst sont traitées immédiatement, sans temporisation au rythme du débit. Sans nodelay, nginx retarderait artificiellement une requête en burst — pas le comportement souhaité en pratique.

Que fait le convertisseur .htaccess vers nginx ?

Apache et nginx ont des modèles de configuration différents : Apache relit .htaccess à chaque requête (coûteux mais souple), nginx analyse sa configuration une fois au reload (rapide mais sans override par requête). Il n’y a pas de conversion 1:1 complète, mais les directives clés sont mappables :

Apachenginx
Redirect 301 /old /newrewrite ^/old$ /new permanent;
Redirect 302 /a /brewrite ^/a$ /b redirect;
RewriteRule ^foo$ /bar [L]rewrite ^foo$ /bar last;
RewriteRule … [R=301,L]rewrite … permanent;
Header always set X-Frame-Options DENYadd_header X-Frame-Options "DENY" always;
ErrorDocument 404 /404.htmlerror_page 404 /404.html;
Options -Indexesautoindex off;
Require ip 192.168.1.1allow 192.168.1.1;
Deny from 203.0.113.4deny 203.0.113.4;
<IfModule>commenté à plat (nginx n’a pas de conditionnel par module)

Les directives non mappables reviennent en commentaire # TODO (could not convert): …. Le convertisseur est déterministe — la même entrée donne toujours la même sortie, pas de rate-limit IA, pas d’aller-retour cloud. L’avertissement en tête (« coller à l’intérieur de votre bloc server { ... } ») est obligatoire à lire — les directives émises doivent atterrir dans le bon scope.

Quels pain-points le générateur évite-t-il ?

Quatre classiques qui reviennent dans les tutoriels nginx — et que le générateur évite :

  1. WebSocket coupe après 60 secondes — cause la plus fréquente : proxy_read_timeout 86400s; manquant plus en-têtes d’upgrade incorrects. Le générateur pose les deux automatiquement.
  2. Zone de rate-limit sans référence — la limit_req_zone est émise, mais limit_req dans le bloc location manque. Effet : zéro. Le générateur émet les deux ensemble.
  3. En-têtes de sécurité absents sur les pages d’erreur — sans always, nginx supprime les en-têtes sur les réponses 4xx/5xx. Le générateur pose always sur chaque add_header.
  4. HTTP/3 mal configuréreuseport manquant, ssl_early_data absent, pas d’en-tête Alt-Svc. Le générateur émet les quatre directives dès l’activation de HTTP/3.

Comment est gérée la confidentialité ?

100 % côté client. Le générateur tourne intégralement dans le navigateur. Aucun endpoint serveur pour valider la configuration, aucun appel de télémétrie, aucun cookie, aucun compte. Si vous fermez l’onglet, vos réglages disparaissent — le générateur ne persiste rien. Pour conserver un historique, téléchargez la nginx.conf après chaque édition et versionnez-la dans votre dépôt.

Ce qui n’a volontairement pas été construit

  • Pas de validation en direct avec nginx -t — exigerait un aller-retour serveur ou un portage WebAssembly de nginx lui-même. À la place, l’entête du générateur et l’astuce UI renvoient à sudo nginx -t après déploiement.
  • Pas d’émission automatique de Let’s Encrypt — le générateur ne fournit que le snippet webroot Certbot. L’activation du certificat demande un accès serveur et sort du périmètre navigateur.
  • Pas de mode GUI Nginx Proxy Manager — pour un workflow GUI-first, utilisez directement Nginx Proxy Manager. Ce générateur s’adresse aux devs qui gardent la config comme du code.
  • Pas de règles ngx_mod_security — le tuning WAF est un outil à part (trop spécialisé, trop dépendant des rulesets).
  • Pas de variante Apache 2.2.htaccess 2.2 est couvert par l’outil sœur htaccess-generator.
  • Pas d’éditeur de profil de caching — les défauts gzip et la règle long-cache du bloc SPA couvrent 90 % des cas.

Où trouver plus de détails ?

Dernière mise à jour :

Vous pourriez aussi aimer