2015-09-04 6 views
14

Gibt es einen Befehl, der alle vhosts oder Server auflistet, die unter nginx auf CentOS laufen? Ich möchte die Ergebnisse zu Berichtszwecken in eine Textdatei pipen.Wie kann ich alle vhosts in nginx auflisten

Ich suche nach etwas ähnliches zu diesem Befehl, den ich für Apache verwenden:

apachectl -S 2> & 1 | grep 'Port 80'

+0

Das hängt davon ab, was Sie 'vhost' nennen. Der Serverblock von Nginx könnte mit einer beliebigen Anzahl von Domänen übereinstimmen. Vielleicht möchten Sie alle Serverblöcke auflisten? –

+0

Ja, Serverblöcke funktionieren. Wahrscheinlich diejenigen für Port 80. Der Punkt ist, alle Websites aufzulisten, um die Abrechnung für das Hosting zu generieren. – Corgalore

Antwort

13

Update: Dank @Putnik für den Hinweis auf einen einfacheren Weg (aber ich ziehe nur Inserat sites-enabled):

grep server_name /etc/nginx/sites-enabled/* -RiI 

Old Post:

versuchen, etwas wie folgt aus:

find /etc/nginx/sites-enabled/ -type f -print0 | xargs -0 egrep '^(\s|\t)*server_name' 

Hoffe, dass hilft!

+1

Das funktioniert, außer dass ich keinen sites-fähigen Ordner habe, also habe ich diesen Teil gelöscht. – Corgalore

+0

Wenn Sie Tausende von Websites hosten, besteht die Möglichkeit, dass einige Ihrer Confs mehrere Domains enthalten, die durch Zeilenumbrüche getrennt sind. Diese Antwort wird diese nicht erfassen. Siehe die Antwort von Anthony Briggs, die am vollständigsten ist. –

13

grep server_name /etc/nginx/* -RiI

Imho viel schneller tippen als @ Haubix Antwort. hinzufügen |grep -v "#" optional

1

Sie können die Domains eine Zeile Liste zu einem Zeitpunkt, der Start folgende Verwendung

nginx_domains(){ 
    domains=`find /etc/nginx/ -type f -name "*.conf" -print0 | xargs -0 egrep '^(\s|\t)*server_name' | sed -r 's/(.*server_name\s*|;)//g'` 
    for domain in $domains; do 
     echo $domain; 
    done 
} 
+0

Dies funktioniert nicht auf den meisten Systemen, nur die Kernkonfigurationsdateien enden in '.conf', plus Konfigurationszeilen wie' server_names_hash_bucket_size' –

11

ab Version 1.9.2 können Sie tun:

nginx -T 

zeigen komplette nginx Konfiguration

nginx -T | grep "server_name " #include the whitespace to exclude non relevant results 

zeigen Sie alle Servernamen

8

Die Antworten so weit wird funktionieren, außer wenn Sie server_name Richtlinien haben mehrere Linien laufen über, dann wird es still scheitern. Sie scheinen auch für den menschlichen Verzehr geschrieben zu sein (nehmen Sie zusätzliche Zeilen wie server_name_in_redirect off; auf), so dass Sie sie nicht in ein Skript aufnehmen können.

ich viele virtuelle Hosts haben, und wollte die Ausgabe in einem Skript verwenden ( seufzen), also hier ist etwas, was viel länger ist, sollte aber dafür robust genug sein:

nginx -T | sed -r -e 's/[ \t]*$//' -e 's/^[ \t]*//' -e 's/^#.*$//' -e 's/[ \t]*#.*$//' -e '/^$/d' | \ 
sed -e ':a;N;$!ba;s/\([^;\{\}]\)\n/\1 /g' | \ 
grep -P 'server_name[ \t]' | grep -v '\$' | grep '\.' | \ 
sed -r -e 's/(\S)[ \t]+(\S)/\1\n\2/g' -e 's/[\t ]//g' -e 's/;//' -e 's/server_name//' | \ 
sort | uniq | xargs -L1 

Da es lang ist und \ -y, werde ich eine kurze Erklärung jeder Zeile enthalten.

  1. Erhalten nginx seine gesamte Konfiguration drucken (so dass wir uns keine Sorgen über die Include-Dateien) und sanieren sie: entfernen vorderen und hinteren Raum, Kommentare (einschließlich Hinter sind) und Leerzeilen.
  2. Jede Zeile, die fortgesetzt werden, nicht mit einem Semikolon oder eine geschweifte Klammer enden sollte, so ersetzen wir jede \n ohne ein vorhergehendes ;, { oder } mit einem Leerzeichen.Dies muss sed's Weirdo :a;N;$!ba; greifen die ganze Datei Trick, und einige Gruppierung, so dass wir das letzte Zeichen zurück mit \1, plus ein paar zusätzliche Backslashes für Glück setzen können.
  3. Jetzt können wir jede Zeile server_name ziehen, mit einigen zusätzlichen Prüfungen, um nginx Variablen ($foo) zu entfernen und nur gültige Domänen (dh nicht localhost und _).
  4. Alle Registerkarten/Leerzeichen zwischen Wörtern werden in Wagenrücklauf umgewandelt, dann entfernen wir überschüssige Leerzeichen (nur für den Fall), Semikolons und den server_name Teil.
  5. Schließlich sortieren, uniqify es und xargs -L1 verwenden, um die einzelne leere Zeile an der Spitze zu entfernen.

Hinweis, dass es einige Bits hier in der technisch verdoppeln sind, aber Ich mag so klar und robust wie möglich sein. Verbesserungsvorschläge sind jedoch willkommen.

+0

Dies sollte die akzeptierte Antwort sein. Alle anderen nehmen nur Domains in der gleichen Zeile wie die Bezeichnung "Servername". Die meisten meiner Nginx-Confs haben zusätzliche Domains, die durch Zeilenumbrüche getrennt sind. –

Verwandte Themen