2015-09-04 15 views
14

Esiste un comando che elencherà tutti i vhost o server in esecuzione su nginx su CentOS? Vorrei riassociare i risultati a un file di testo per scopi di reporting.Come posso elencare tutti i vhosts in nginx

Sto cercando qualcosa di simile a questo comando che uso per Apache:

apachectl -S 2> & 1 | grep 'di porta 80'

+0

Dipende da ciò che si chiama 'vhost'. Il blocco del server di Nginx potrebbe corrispondere a qualsiasi numero di domini. Forse vuoi elencare tutti i blocchi del server? –

+0

Sì, i blocchi del server funzionerebbero. Probabilmente quelli per la porta 80. Il punto è elencare tutti i siti Web per generare la fatturazione per l'hosting. – Corgalore

risposta

13

Update: Grazie a @Putnik per aver ricordato un modo più semplice (ma io preferisco solo annuncio siti-enabled):

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

Old Post:

provare qualcosa di simile:

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

Spero che questo aiuti!

+1

Funziona, tranne che non ho una cartella abilitata per i siti, quindi ho abbandonato quella parte. – Corgalore

+0

Se stai ospitando migliaia di siti web, è probabile che alcuni dei tuoi conf ti abbiano più domini separati da newline. Questa risposta non catturerà quelli. Vedi la risposta di Anthony Briggs che è la più completa. –

13

grep server_name /etc/nginx/* -RiI

Imho molto più veloce da digitare rispetto @ risposta di Haubix. Aggiungere |grep -v "#" opzionalmente

1

è possibile elencare i domini di una riga alla volta utilizzando la seguente

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

Questo non funziona sulla maggior parte dei sistemi, solo i file di configurazione di base terminano in '.conf', inoltre inserirà righe di configurazione come' server_names_hash_bucket_size' –

11

a partire dalla versione 1.9.2 si può fare:

nginx -T 

spettacolo configurazione completa nginx

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

mostra tutti i nomi dei server

8

Le risposte finora funzioneranno, tranne se avete server_name direttive in esecuzione su più righe, allora sarà fallire in modo silenzioso. Sembrano anche scritti per il consumo umano (raccogliendo righe extra come server_name_in_redirect off;) in modo da non poterli includere in uno script.

Ho un sacco di host virtuali, e voleva utilizzare l'uscita in uno script (sigh), quindi ecco qualcosa che è molto più a lungo, ma dovrebbe essere abbastanza robusto per questo scopo:

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 

Poiché è lungo e \ -y, includerò una rapida spiegazione di ogni riga.

  1. Get nginx per stampare tutta la sua configurazione (in modo che non ci si deve preoccupare i file da includere) e sanificare esso: rimuovere iniziali e finali spazio, commenti (compresi quelli finali) e righe vuote.
  2. Ogni riga che non termina con un punto e virgola o parentesi graffa deve essere continuata, quindi sostituiamo qualsiasi \n senza un precedente ;, { o } con uno spazio.Questo ha bisogno di usare lo strambo di sed :a;N;$!ba; afferrare l'intero trucco di file, e qualche raggruppamento in modo che possiamo rimettere l'ultimo carattere con \1, oltre a un sacco di backslash extra per fortuna.
  3. Ora siamo in grado di estrarre ciascuna riga server_name, con alcuni controlli aggiuntivi per rimuovere le variabili nginx ($foo) e includere solo domini validi (ovvero non localhost e _).
  4. Qualsiasi tabulazione/spazio tra le parole viene trasformata in ritorni a capo, quindi rimuoviamo gli spazi in eccesso (per ogni evenienza), i punti e virgola e la parte server_name.
  5. Infine ordinalo, uniqify e usa xargs -L1 per rimuovere la singola riga vuota nella parte superiore.

noti che ci sono alcuni bit in qui che sono tecnicamente raddoppio, ma mi piace essere il più chiaro e robusto possibile. Suggerimenti per il miglioramento benvenuto, però.

+0

Questa dovrebbe essere la risposta accettata. Tutti gli altri accettano solo i domini sulla stessa riga dell'etichetta "server_name". La maggior parte dei miei conf i nginx hanno domini aggiuntivi separati da newline. –

Problemi correlati