Как я могу перечислить всех vhosts в nginx

Есть ли команда, которая будет перечислять все vhosts или серверы под nginx на CentOS? Я хотел бы передать результаты в текстовый файл для целей отчетности.

Я ищу что-то подобное этой команде, которую я использую для Apache:

apachectl -S 2> & 1 | grep 'порт 80'

Ответ 1

Обновление: спасибо @Putnik за то, что вы указали более простой способ (но я предпочитаю только перечисление сайтов):

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

Старый пост:

Попробуйте что-то вроде этого:

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

Надеюсь, это поможет!

Ответ 2

начиная с версии 1.9.2 вы можете сделать:

nginx -T

показать полную конфигурацию nginx

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

показать все имена серверов

Ответ 3

grep server_name/etc/nginx/* -RiI

Имхо намного быстрее, чем @Haubix. Добавить |grep -v "#" необязательно

Ответ 4

Ответы до сих пор будут работать, за исключением случаев, когда у вас есть директивы server_name работающие на нескольких строках, тогда он будет терпеть неудачу. Они также, похоже, написаны для потребления человеком (выбирая дополнительные строки, такие как server_name_in_redirect off;), поэтому вы не можете включить их в скрипт.

У меня много виртуальных хостов, и я хотел использовать вывод в скрипте (вздох), поэтому здесь что-то намного длиннее, но должно быть достаточно прочным для этой цели:

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

Поскольку он длинный и \ -y, я включу быстрое объяснение каждой строки.

  1. Получите nginx, чтобы распечатать всю свою конфигурацию (чтобы нам не приходилось беспокоиться о том, какие файлы включать) и дезинформировать его: удалить ведущее и конечное пространство, комментарии (включая конечные) и пустые строки.
  2. Каждая строка, которая не заканчивается точкой с запятой или фигурной скобкой, должна быть продолжена, поэтому мы заменяем любой \n без предшествующего ; , { или } с пробелом. Это нужно использовать sed weirdo :a;N;$!ba; захватить весь трюк файла и некоторую группировку, чтобы мы могли вернуть последний символ с \1, плюс кучу дополнительных обратных косых черт для удачи.
  3. Теперь мы можем вывести каждую строку server_name с некоторыми дополнительными проверками для удаления nginx-переменных ($foo) и включать только допустимые домены (то есть не localhost и _).
  4. Любые вкладки/пробелы между словами превращаются в возврат каретки, затем мы удаляем лишние пробелы (на всякий случай), полуколоны и часть server_name.
  5. Наконец, сортируйте его, uniqify и используйте xargs -L1 чтобы удалить единственную пустую строку вверху.

Обратите внимание, что здесь есть несколько бит, которые технически удваиваются, но мне нравится быть максимально ясным и надежным. Однако предложения по улучшению приветствуются.

Ответ 5

Вы можете перечислить домены по одной строке за раз, используя следующие

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
}