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 :
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
# 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 :
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
IoErrorsauf si l'inclusion utilise un modèle global
Structure AST#
L'analyseur produit une arborescence de nœuds Directive :
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 :
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#
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 :
/etc/nginx/nginx.conf(Linux par défaut)/usr/local/etc/nginx/nginx.conf(FreeBSD, Homebrew Intel)/opt/homebrew/etc/nginx/nginx.conf(Silicium Apple Homebrew)- 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.
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#
- Couverture de la directive — chaque directive comprise par le convertisseur
- Aperçu de la compatibilité nginx — le pipeline d'analyse → conversion → service en trois étapes
- Tableau de bord de contrôle en amont — vue visuelle de ce que l'analyseur a détecté
- Guide de migration — étape par étape de nginx à bext
- Présentation de l'architecture — où l'analyseur s'inscrit dans le cycle de vie plus large des requêtes