web-dev-qa-db-fra.com

Comment puis-je lister tous les vhosts dans nginx

Existe-t-il une commande répertoriant tous les vhosts ou serveurs s'exécutant sous nginx sur CentOS? Je voudrais transférer les résultats dans un fichier texte à des fins de rapport.

Je recherche quelque chose de similaire à cette commande que j'utilise pour Apache:

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

27
Corgalore

Mise à jour: Merci à @Putnik pour avoir indiqué un moyen plus simple (mais je préfère uniquement lister les sites activés):

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

Old Post:

Essayez quelque chose comme ça:

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

J'espère que ça t'as aidé!

28

à partir de la version 1.9.2, vous pouvez faire:

nginx -T

affiche la configuration complète de nginx

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

vous montrer tous les noms de serveur

46
Alessio

Les réponses jusqu’à présent fonctionneront, sauf si vous avez server_name directives sur plusieurs lignes, cela échouera silencieusement. Ils semblent aussi être destinés à la consommation humaine (ramasser des lignes supplémentaires comme server_name_in_redirect off;) vous ne pouvez donc pas les inclure dans un script.

J'ai beaucoup d'hôtes virtuels et je voulais utiliser la sortie dans un script ( sigh ), alors voici quelque chose qui est beaucoup plus long, mais devrait l'être assez robuste pour cela:

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

Depuis que c'est long et \- y, je vais inclure une brève explication de chaque ligne.

  1. Demandez à nginx d’imprimer l’intégralité de sa configuration (pour ne pas avoir à vous soucier des fichiers à inclure) et désinfectez-le: supprimez les espaces de début et de fin, les commentaires (y compris les derniers) et les lignes vides.
  2. Chaque ligne qui ne se termine pas par un point-virgule ou une accolade doit être poursuivie, nous remplaçons donc tout \n sans précédent ;, { ou } avec un espace. Cela doit utiliser sed's weirdo :a;N;$!ba; récupère l'intégralité de l'astuce sur les fichiers, ainsi qu'un certain regroupement, de manière à pouvoir remettre le dernier caractère avec \1, plus quelques barres obliques inverses supplémentaires pour la chance.
  3. Maintenant nous pouvons tirer chaque server_name ligne, avec quelques vérifications supplémentaires pour supprimer les variables nginx ($foo) et n'inclut que les domaines valides (c'est-à-dire pas localhost et _).
  4. Tous les tabulations/espaces entre les mots sont transformés en retours à la ligne, puis nous supprimons les espaces en surplus (au cas où), les points-virgules et le server_name partie.
  5. Enfin, triez-le, unifiez-le et utilisez xargs -L1 pour supprimer la seule ligne blanche en haut.

Notez qu'il y a quelques bits ici qui sont techniquement en double, mais j'aime être aussi clair et robuste que possible. Des suggestions d'amélioration sont toutefois les bienvenues.

19
Anthony Briggs

grep server_name /etc/nginx/* -RiI

Imho beaucoup plus rapide à taper que la réponse de @ Haubix. Ajouter |grep -v "#" éventuellement

14
Putnik

Outre toutes les autres solutions intéressantes, si vous avez simplement besoin d’une simple liste de tous les noms, un par ligne, comme:

example.com
my.example.com
etc.com

Analyser la config. Récupère toutes les lignes avec server_name. Retirer server_name. Enfin, mettez un domaine par ligne.

Sudo nginx -T | grep "server_name " | sed 's/.*server_name \(.*\);/\1/' | sed 's/ /\n/'
1
everyman

Vous pouvez répertorier les domaines ligne par ligne à l’aide des éléments suivants:

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
doublesharp