如何在nginx中列出所有vhost

Cor*_*ore 30 linux shell nginx

是否有命令列出在CentOS上运行在nginx下的所有vhost或服务器?我想将结果通过管道传输到文本文件以进行报告.

我正在寻找类似于我用于Apache的这个命令的东西:

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

Ale*_*sio 58

从版本1.9.2开始,您可以:

nginx -T
Run Code Online (Sandbox Code Playgroud)

显示完整的nginx配置

nginx -T | grep "server_name " #include the whitespace to exclude non relevant results
Run Code Online (Sandbox Code Playgroud)

显示所有服务器名称

  • 更好的答案是,不假设配置目录结构,仅显示nginx知道的内容。谢谢 (4认同)
  • 这需要绿色勾号。并且可以修改以包含较低 Nginx 版本的当前答案。 (2认同)

Mar*_*ner 27

更新: 感谢@Putnik指出一种更简单的方法(但我更喜欢只列出网站启用):

grep server_name /etc/nginx/sites-enabled/* -RiI
Run Code Online (Sandbox Code Playgroud)

旧帖子:

尝试这样的事情:

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

希望有所帮助!


Ant*_*ggs 21

到目前为止的答案是有效的,除非你有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
Run Code Online (Sandbox Code Playgroud)

由于它很长而且是\-y,我将包括每行的快速解释.

  1. 获取nginx以打印其整个配置(以便我们不必担心要包含哪些文件)并清理它:删除前导和尾随空格,注释(包括尾随的)和空行.
  2. 不以分号或大括号结束每行应该继续下去,所以我们更换任何\n没有前面的;,{}有空间.这需要使用sed的怪人:a;N;$!ba;抓取整个文件技巧,并进行一些分组,以便我们可以将最后一个字符放回去\1,加上一堆额外的反斜杠以获得好运.
  3. 现在我们可以拉出每一server_name行,通过一些额外的检查来删除nginx变量($foo)并且只包含有效域(即不包括localhost_).
  4. 单词之间的任何制表符/空格都会变成回车符,然后我们删除剩余空格(以防万一),分号和server_name部分.
  5. 最后对它进行排序,将其统一并用于xargs -L1删除顶部的单个空白行.

请注意,这里有一些技术上是加倍的,但我希望尽可能清晰和健壮.不过,欢迎提出改进建议.

  • 这应该是公认的答案。所有其他域仅在与“ server_name”标签相同的行上捕获域。我的大多数Nginx conf都具有用换行符分隔的其他域。 (2认同)

Put*_*nik 15

grep server_name /etc/nginx/* -RiI

Imho比@Haubix的答案快得多.|grep -v "#"可选添加


eve*_*man 6

除了所有其他出色的解决方案,如果您只需要每行一个所有名称的简单列表,例如:

example.com
my.example.com
etc.com
Run Code Online (Sandbox Code Playgroud)

解析配置。获取所有行server_name。删除server_name。最后每行放一个域。

sudo nginx -T | grep "server_name " | sed 's/.*server_name \(.*\);/\1/' | sed 's/ /\n/'
Run Code Online (Sandbox Code Playgroud)


cue*_*dee 5

@anthony-briggs正确地指出,如果您的server_name ... ;声明分布在多行中,则此处给出的大多数其他答案将不起作用。

但是,如果您能负担得起聘请翻译的奢侈费用perl,您可以将他的解决方案缩短为以下这段话:

nginx -T | perl -ln0777e '$,=$\; s/^\s*#.*\n//mg; print grep !$u{$_}++ && !m/^_$/, map m/(\S+)/g, m/\bserver_name\s++(.*?)\s*;/sg'
Run Code Online (Sandbox Code Playgroud)

分块:

perl -l -n -0777 -e
Run Code Online (Sandbox Code Playgroud)

-l:使print命令以换行符终止其输出;

它还会导致在读取时从每个输入记录中删除尾随换行符,但这不会打扰我们,因为我们:

-n -0777$_:一次性将所有输入放入(一条记录);

-e:简单地执行下一个参数作为 Perl 源;


$, = $\ ;
Run Code Online (Sandbox Code Playgroud)

使print命令还在每个参数之间输出换行符;


s/^\s*#.*\n//mg ;
Run Code Online (Sandbox Code Playgroud)

删除所有评论;

忽略前导空格,假定注释从行开始一直到行尾(.此处与换行符不匹配);


m/\bserver_name\s++(.*?)\s*;/sg
Run Code Online (Sandbox Code Playgroud)

生成所有server_name ... ;声明之间的所有内容(此处. 换行符匹配);


...全部map-ped 为:

map m/(\S+)/g, 
Run Code Online (Sandbox Code Playgroud)

...这将只留下连续的非空白块;


...然后将其grep-ped 以获得唯一性,而不是特殊的“ _”服务器名称,

grep !$u{$_}++ && !m/^_$/, 
Run Code Online (Sandbox Code Playgroud)

...和print-ed(未排序)。