ENbext.dev
DocumentationCompatibilité nginx

Traduction automatique depuis l’anglais. Consulter l’original.

Sur cette page

Analyseur de configuration nginx

bext comprend un analyseur de configuration nginx complet écrit en Rust. Il tokenise, analyse et construit un arbre de syntaxe abstraite (AST) à partir de tout nginx.conf valide.

Grammaire#

Le format de configuration nginx est une structure récursive simple :

code
config    ::= directive*
directive ::= word+ (';' | '{' directive* '}')

Une directive est un ou plusieurs mots suivis soit d'un point-virgule (directive simple), soit d'un bloc délimité par des accolades contenant des directives enfants.

Lexer#

Le tokenizer écrit à la main produit cinq types de tokens :

Jeton Description
Word Valeur de chaîne non citée ou entre guillemets
OpenBrace {
CloseBrace }
Semicolon ;
Eof Fin de la saisie

Règles de citation#

  • Guillemets doubles — séquences d'échappement prises en charge : \", \\
  • Guillemets simples — contenu littéral, pas d'échappement
  • non cité — délimité par des espaces, des accolades ou des points-virgules
  • Commentaires — # jusqu'à la fin de la ligne, avec suivi du numéro de ligne
nginx
# Both of these are equivalent:
server_name "my-site.example.com";
server_name my-site.example.com;

# Quotes needed for special characters:
rewrite "^/old/(.*)$" "/new/$1" permanent;

Inclure l'extension#

L'analyseur résout les directives include en ligne lors de l'analyse :

nginx
http {
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

Comportement :

  • Les chemins relatifs sont résolus par rapport au répertoire du fichier inclus
  • Les modèles Glob ( *.conf, sites-enabled/* ) sont développés
  • Profondeur maximale — 16 niveaux d'imbrication pour éviter les inclusions circulaires
  • No-match inclut — non mortel ; enregistré comme avertissement
  • Fichiers manquants — renvoie un IoError sauf si l'inclusion utilise un modèle global

Structure AST#

L'analyseur produit une arborescence de nœuds Directive :

rust
pub struct Directive {
    pub name: String,           // e.g., "server", "listen", "proxy_pass"
    pub args: Vec<String>,      // e.g., ["443", "ssl", "http2"]
    pub children: Vec<Directive>, // block contents (empty for simple directives)
    pub file: String,           // source file path
    pub line: usize,            // line number in source
    pub column: usize,          // column number
}

Le wrapper NginxConfig de niveau supérieur fournit des méthodes pratiques :

rust
config.http_block()      // -> Option<&Directive>  — the http {} block
config.server_blocks()   // -> Vec<&Directive>     — all server {} blocks
config.upstream_blocks() // -> Vec<&Directive>     — all upstream {} blocks
config.get_directive("worker_processes") // -> Option<&Directive>

Gestion des erreurs#

L'analyseur signale six types d'erreurs avec des informations sur les fichiers et les lignes :

Erreur Description
UnexpectedToken Erreur de syntaxe : jeton inattendu dans le flux
UnterminatedString Devis ouvert mais jamais fermé
EmptyDirective Bloc ou directive simple sans nom
IncludeDepthExceeded Plus de 16 niveaux d'imbrication inclus
MissingIncludePath include sans argument de chemin
IoError Échec de lecture du fichier

Usage#

rust
use bext_nginx_compat::{parse_and_convert, parse_and_convert_string};

// Parse from a file path (resolves includes)
let config = parse_and_convert("/etc/nginx/nginx.conf")?;

// Parse from a string (no include resolution)
let config = parse_and_convert_string(raw_config)?;

// Auto-detect nginx installation and parse
let config = bext_nginx_compat::detect_and_convert()?;

Détection#

bext recherche automatiquement les configurations nginx sur :

  1. /etc/nginx/nginx.conf (Linux par défaut)
  2. /usr/local/etc/nginx/nginx.conf (FreeBSD, Homebrew Intel)
  3. /opt/homebrew/etc/nginx/nginx.conf (Silicium Apple Homebrew)
  4. Variable d'environnement $NGINX_CONF (chemin personnalisé)

Il détecte également si nginx est en cours d'exécution en vérifiant les fichiers PID sur /run/nginx.pid et /var/run/nginx.pid.

Conseil

Les directives globales include qui ne correspondent pas (par exemple include sites-enabled/* sur un répertoire vide) sont traitées comme des avertissements et non comme des erreurs. Les fichiers non globaux manquants sont fatals : vérifiez la sortie d'erreur si un hôte virtuel disparaît après l'analyse.

En rapport#

Modifier cette page ↗Besoin d’aide ? ↗
Rechercher dans la documentation

Saisissez un sujet, une commande ou une question.