Migrer depuis nginx
bext remplace entièrement nginx — TLS, proxy inverse, service statique, compression, PHP, hôtes virtuels — dans un seul binaire. Il existe deux voies de migration :
Option A : Automatique (Zéro configuration)#
bext peut lire directement votre configuration nginx existante. Aucune traduction manuelle n’est nécessaire.
# Build with nginx-compat feature
cargo build -p bext-server --features nginx-compat --release
# Launch the preflight dashboard (auto-detects /etc/nginx/nginx.conf)
sudo ./target/release/bext-server nginx-takeover
Cela ouvre un tableau de bord Web sur http://localhost:9999 affichant :
- Tous les hôtes virtuels avec noms de serveur, ports, SSL et emplacements
- Vérifications en amont (accès aux certificats, disponibilité des ports, autorisations)
- Cliquez sur « Prendre le contrôle » pour arrêter nginx et desservir tout le trafic via bext.
- Cliquez sur "Rollback" pour restaurer instantanément nginx
Ce qui est détecté automatiquement#
| Fonctionnalité nginx | Manutention bext |
|---|---|
Blocs server {} |
Routage d'hôte virtuel |
server_name (exact, joker, regex) |
Correspondance du nom d'hôte |
listen 80/443 ssl http2 |
Liaison de port + TLS |
ssl_certificate / ssl_certificate_key |
chargement du certificat rustls |
location (=, ^~, ~, ~ *, préfixe) |
Correspondance de priorité compatible nginx |
proxy_pass + proxy_set_header |
Proxy inverse avec injection d'en-tête |
upstream {} (least_conn, ip_hash) |
Équilibrage de charge |
try_files |
Sondage de fichiers + repli SPA/PHP |
fastcgi_pass |
Runtime PHP intégré |
gzip |
compression gzip + brotli + zstd |
add_header |
En-têtes de réponse |
return / redirections |
HTTP → HTTPS, redirections de domaine |
include (globes récursifs) |
Extension complète |
Ce qui est ignoré (avec avertissements)#
Un petit nombre de directives — notamment les scripts njs ( js_set, js_content ) — sont analysées sans erreurs mais ne sont pas traduites. Le tableau de bord les affiche sous forme d'avertissements.
Option B : traduction manuelle#
Pour un bon démarrage, traduisez votre configuration nginx en bext.config.toml.
Site statique#
# nginx
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/ssl/cert.pem;
ssl_certificate_key /etc/ssl/key.pem;
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
# bext.config.toml
[server]
listen = "0.0.0.0:443"
static_dir = "/var/www/html"
[tls]
mode = "manual"
cert = "/etc/ssl/cert.pem"
key = "/etc/ssl/key.pem"
Proxy inverse#
# nginx
upstream api {
least_conn;
server 10.0.0.1:8080 weight=3;
server 10.0.0.2:8080;
server 10.0.0.3:8080 backup;
keepalive 32;
}
server {
listen 80;
location /api/ {
proxy_pass http://api;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
# bext.config.toml
[server]
listen = "0.0.0.0:80"
[upstreams.api]
strategy = "least_conn"
keepalive = 32
servers = [
{ url = "http://10.0.0.1:8080", weight = 3 },
{ url = "http://10.0.0.2:8080" },
{ url = "http://10.0.0.3:8080", backup = true },
]
[[route_rules]]
pattern = "/api/**"
proxy = "api"
PHP ( Laravel / WordPress )#
# nginx
server {
listen 80;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
# bext.config.toml
[server]
listen = "0.0.0.0:80"
[php]
enabled = true
document_root = "/var/www/html"
workers = 4
index = "index.php"
bext utilise un runtime PHP intégré (pas de PHP-FPM externe), donc aucune configuration socket/TCP n'est nécessaire.
SSL avec renouvellement automatique#
# nginx (with certbot)
server {
listen 443 ssl http2;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
}
server {
listen 80;
return 301 https://$host$request_uri;
}
# bext.config.toml
[server]
listen = "0.0.0.0:443"
[tls]
mode = "acme"
domains = ["example.com"]
email = "admin@example.com"
bext gère les défis ACME, la fourniture de certificats et le renouvellement automatique en interne – aucun certbot n'est nécessaire.
Compression Gzip#
# nginx
gzip on;
gzip_types text/plain text/css application/json application/javascript;
gzip_comp_level 6;
gzip_min_length 256;
bext active la compression gzip + brotli + zstd par défaut. Aucune configuration nécessaire. Pour personnaliser :
# bext.config.toml (optional — defaults are sensible)
[[route_rules]]
pattern = "/**"
compression = "balanced" # off | fast | balanced | max
Différences clés#
| nginx | bext |
|---|---|
| PHP-FPM externe sur FastCGI | Runtime PHP intégré (pas de configuration de socket) |
| certbot pour Let's Encrypt | ACME intégré (aucun certbot requis) |
| Module gzip séparé | gzip + brotli + zstd intégrés |
sites-available / sites-enabled |
bext.config.toml unique ou détection automatique |
nginx -t pour le test de configuration |
bext config validate |
nginx -s reload |
Rechargement à chaud POST /api/reload ou bext-server |
| Fichier PID + maître/travailleur | Processus unique avec pool de threads |
| Accéder aux fichiers journaux | Journaux JSON structurés + OpenTelemetry |
deny all / allow |
WAF avec filtrage IP, géoblocage, limitation de débit |
limit_req_zone |
Limiteur de débit intégré (en mémoire ou sauvegardé sur Redis) |
proxy_cache |
Cache ISR avec invalidation basée sur des balises |
Restauration#
Si vous avez utilisé la reprise automatique et devez revenir en arrière :
- Cliquez sur « Restaurer vers nginx » dans le tableau de bord de contrôle en amont.
- Ou manuellement :
sudo systemctl start nginx
bext enregistre l'état système de nginx et le restaure exactement lors de la restauration.
Avant de vous engager dans une prise de contrôle complète, exécutez bext-server nginx-takeover en mode d'inspection en lecture seule pour examiner le rapport de couverture des directives : le tableau de bord signale toutes les directives qui seront ignorées, telles que les scripts njs, afin que vous sachiez quoi gérer avant de procéder au basculement.
Le runtime PHP intégré ( [php] ) gère FastCGI en interne — il n'y a pas de socket externe à configurer. Si vous comptiez auparavant sur un chemin de socket PHP-FPM spécifique, déplacez la configuration PHP vers bext.config.toml [php] plutôt que de repointer fastcgi_pass. Voir le PHP & nginx -documents compatibles pour plus de détails.
En rapport#
- nginx Aperçu — mode mascarade et matrice de couverture de directive complète
- Rachat de nginx — présentation détaillée du tableau de bord de contrôle en amont et restauration
- Couverture de la directive — quelles directives nginx traduisent et lesquelles sont ignorées
- Mode mascarade — exécution de bext en remplacement immédiat de nginx
- TLS et HTTPS — ACME, SNI et gestion des certificats
- Mise en cache — Cache ISR qui remplace
proxy_cache
Links#
- nginx.org — documentation officielle nginx et référence du module