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