nginx-Pendants zu Apaches a2ensite / a2dissite
  • Rust 93.4%
  • Shell 6.6%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-08-07 01:45:09 +02:00
common initial commit 2026-08-07 01:45:09 +02:00
gen-completions initial commit 2026-08-07 01:45:09 +02:00
nxdissite initial commit 2026-08-07 01:45:09 +02:00
nxensite initial commit 2026-08-07 01:45:09 +02:00
package initial commit 2026-08-07 01:45:09 +02:00
Cargo.toml initial commit 2026-08-07 01:45:09 +02:00
LICENSE initial commit 2026-08-07 01:45:09 +02:00
README.md initial commit 2026-08-07 01:45:09 +02:00

nxensite / nxdissite

nginx-Pendants zu Apaches a2ensite / a2dissite: aktivieren bzw. deaktivieren einen vhost, indem in sites-enabled ein symbolischer Link auf die zugehörige Datei in sites-available angelegt bzw. entfernt wird (Debian/Ubuntu-Konvention für nginx; die Verzeichnisse müssen existieren und per include /etc/nginx/sites-enabled/*; in der nginx.conf eingebunden sein).

Das Projekt besteht aus vier Crates in einem Cargo-Workspace:

nx-tools/
├── common/           Bibliothek "nx-common" (Logik, Übersetzungen, Completion-Generatoren)
├── nxensite/         Binary: vhosts aktivieren
├── nxdissite/        Binary: vhosts deaktivieren
├── gen-completions/  Internes Build-Tool: erzeugt die Completion-Skripte für die Paketierung
└── package/          .deb-Paketierung (Kontrolldatei-Vorlagen + Build-Skript)

gen-completions wird nicht installiert es ist ausschließlich ein Werkzeug, das beim Bauen des .deb-Pakets aufgerufen wird (siehe unten).

Bauen

Voraussetzung: ein aktueller Rust-Toolchain (rustup / cargo, Edition 2021).

cargo build --release

Die fertigen Programme liegen danach unter target/release/nxensite und target/release/nxdissite.

Installieren

Empfohlen wird die Installation über das .deb-Paket (siehe Abschnitt .deb-Paket bauen weiter unten) dabei landen die Programme in /usr/sbin und die Shell-Completion wird automatisch mit eingerichtet. Alternativ, z. B. zum schnellen Testen ohne Paketbau, manuell:

sudo install -m 755 target/release/nxensite  /usr/local/sbin/
sudo install -m 755 target/release/nxdissite /usr/local/sbin/

(In diesem Fall müssen die Completion-Skripte separat aus gen-completions erzeugt und von Hand an die in der Tabelle weiter unten genannten Pfade kopiert werden.)

Verwendung

nxensite [OPTIONEN] VHOST...
nxdissite [OPTIONEN] VHOST...

VHOST kann mit oder ohne .conf-Endung angegeben werden, mehrere vhosts können in einem Aufruf gleichzeitig (de)aktiviert werden.

nxensite

Option Bedeutung
-t, --test Nach dem Aktivieren die Syntax der nginx-Konfiguration prüfen (nginx -t). Schlägt der Test fehl, werden die soeben aktivierten vhosts automatisch wieder deaktiviert.
-a, --auto Nach erfolgreichem Syntaxtest automatisch nginx neu laden (impliziert -t).
--list-available Alle in sites-available vorhandenen vhosts auflisten (eine pro Zeile), keine root-Rechte nötig. Wird intern von der Shell-Completion genutzt.
-h, --help Hilfe anzeigen.
-V, --version Version anzeigen.

Beispiele:

sudo nxensite example.com                 # nur aktivieren
sudo nxensite -t example.com               # aktivieren + Syntax prüfen
sudo nxensite -a example.com other.com     # aktivieren, prüfen, bei Erfolg neu laden

nxdissite

Option Bedeutung
--list-enabled Alle aktuell aktivierten vhosts auflisten (eine pro Zeile), keine root-Rechte nötig. Wird intern von der Shell-Completion genutzt.
-h, --help Hilfe anzeigen.
-V, --version Version anzeigen.

Beispiel:

sudo nxdissite example.com other.com

nxdissite entfernt nur den Symlink in sites-enabled; die Datei in sites-available bleibt erhalten (wie bei a2dissite).

Root-Rechte

Das tatsächliche Aktivieren/Deaktivieren erfordert root-Rechte (euid 0); ohne diese wird eine lokalisierte Fehlermeldung ausgegeben und mit Exitcode 77 (EX_NOPERM) beendet. --help, --version, --list-available und --list-enabled funktionieren bewusst auch ohne root, damit z. B. die Shell-Completion für normale Benutzer nutzbar ist.

Exitcodes

Beide Programme verwenden an sysexits.h angelehnte Exitcodes:

Code Bedeutung
0 Erfolg
64 Fehlerhafte Aufrufsyntax (z. B. kein vhost angegeben)
66 vhost-Konfiguration nicht gefunden / nicht aktiviert
69 sites-available/sites-enabled existiert nicht
71 Reload von nginx fehlgeschlagen
73 Symlink konnte nicht erstellt/entfernt werden
77 Keine root-Rechte
78 nginx -t-Syntaxtest fehlgeschlagen (nur nxensite -t)

Mehrsprachige Meldungen

Alle Ausgaben (Meldungen, Hilfetexte, Beschreibungen) liegen in der Bibliothek nx-common übersetzt vor für: Englisch (Fallback), Deutsch, Französisch, Spanisch, Italienisch, Portugiesisch, Russisch, Chinesisch, Japanisch und Arabisch. Die Sprache wird aus den POSIX-Locale- Umgebungsvariablen ermittelt, in dieser Priorität: LC_ALL, LC_MESSAGES, LANGUAGE, LANG.

Dynamische Shell-Completion

Beide Programme haben selbst keine --completion-Option mehr. Die Completion-Skripte für bash, zsh und fish werden stattdessen einmalig beim Bau des .deb-Pakets erzeugt (siehe unten) und landen als normale Dateien an den von der jeweiligen Shell automatisch durchsuchten Standardpfaden:

Shell Installationspfad
bash /usr/share/bash-completion/completions/nxensite bzw. nxdissite
zsh /usr/share/zsh/vendor-completions/_nxensite bzw. _nxdissite
fish /usr/share/fish/vendor_completions.d/nxensite.fish bzw. nxdissite.fish

Sie bleiben dabei inhaltlich dynamisch: statt eine beim Paketbau eingefrorene Liste zu enthalten, rufen sie bei jedem Tab das jeweilige Programm erneut mit der (nun regulären, sichtbaren) Option --list-available bzw. --list-enabled auf, die die aktuell vorhandenen bzw. aktivierten vhosts live aus dem Dateisystem ausliest. nxensite <Tab> schlägt also immer die tatsächlich vorhandenen, noch nicht aktivierten Konfigurationsdateien vor ganz ohne erneuten Bau/Neuinstallation des Pakets, wenn sich vhosts ändern.

Erzeugt werden diese Skripte durch das interne, nicht installierte Hilfsprogramm gen-completions, das die vorhandenen Generator-Funktionen aus nx-common::completion aufruft (dieselbe Bibliothek, die auch nxensite/nxdissite selbst nutzen).

.deb-Paket bauen

Voraussetzungen auf dem Baurechner: cargo/rustc sowie die Debian-Standardwerkzeuge dpkg-deb, dpkg und gzip.

package/build-deb.sh

Das Skript

  1. baut den gesamten Workspace (cargo build --release --workspace),
  2. lässt gen-completions die sechs Completion-Skripte erzeugen,
  3. stellt eine Paketwurzel mit nxensite/nxdissite in /usr/sbin, den Completion-Skripten an ihren Standardpfaden sowie README.md/copyright/changelog.Debian.gz unter /usr/share/doc/nginx-vhost-tools zusammen,
  4. schreibt DEBIAN/control (Version wird automatisch aus nxensite/Cargo.toml übernommen, Architektur über dpkg --print-architecture erkannt),
  5. baut daraus mit dpkg-deb --build die Datei dist/nginx-vhost-tools_<version>_<arch>.deb.

Der Maintainer-Eintrag lässt sich per Umgebungsvariable anpassen:

DEB_MAINTAINER="Max Mustermann <max@example.org>" package/build-deb.sh

Installieren

sudo dpkg -i dist/nginx-vhost-tools_0.1.0_amd64.deb
# falls dabei Abhängigkeiten fehlen sollten:
sudo apt-get install -f

Beim Installieren legt dpkg die Programme und die Completion-Skripte einfach an den vorgesehenen Pfaden ab; ein postinst-Skript ist dafür nicht nötig, da bash-completion, zsh und fish diese Standardpfade von sich aus durchsuchen (bash benötigt dafür das separate Paket bash-completion, das deshalb als Suggests eingetragen ist; nginx ist als Recommends eingetragen, da -t/-a ohne installiertes nginx-Binary naturgemäß fehlschlagen).

Konfigurationspfad anpassen

Standardmäßig werden /etc/nginx/sites-available und /etc/nginx/sites-enabled verwendet. Über die Umgebungsvariable NX_CONF_DIR lässt sich das Basisverzeichnis überschreiben (z. B. für Tests):

NX_CONF_DIR=/tmp/nginx-test nxensite -t example.com

Hinweis zum Build in dieser Umgebung

Der Quellcode wurde in dieser Sandbox ohne Netzwerkzugriff und ohne installierten Rust-Toolchain erstellt/geändert und konnte hier daher weder mit cargo build noch mit package/build-deb.sh durchlaufen werden. Struktur und Klammerung wurden statisch geprüft; bitte nach dem Herunterladen cargo build --release --workspace und danach package/build-deb.sh ausführen und mir eventuelle Fehler mitteilen, falls welche auftreten sollten.