如何列出 nginx 中的所有虚拟主机
How can I list all vhosts in nginx
是否有一个命令可以列出 CentOS 上 nginx 下的所有虚拟主机或服务器 运行?我想将结果通过管道传输到文本文件以用于报告目的。
我正在寻找类似于我用于 Apache 的命令的东西:
apachectl -S 2>&1 | grep 'port 80'
更新:
感谢@Putnik 指出了一种更简单的方法(但我更喜欢只列出已启用的站点):
grep server_name /etc/nginx/sites-enabled/* -RiI
旧Post:
尝试这样的事情:
find /etc/nginx/sites-enabled/ -type f -print0 | xargs -0 egrep '^(\s|\t)*server_name'
希望对您有所帮助!
grep server_name /etc/nginx/* -RiI
恕我直言,打字比@Haubix 的回答快得多。
可选添加|grep -v "#"
您可以使用以下方法一次一行列出域
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
}
从版本 1.9.2 开始,您可以:
nginx -T
显示完整的 nginx 配置
nginx -T | grep "server_name " #include the whitespace to exclude non relevant results
显示所有服务器名称
到目前为止的答案都有效,除了 如果你有 server_name
指令 运行 多行,然后它会默默地失败。它们似乎也是为人类消费而编写的(选择额外的行,例如 server_name_in_redirect off;
),因此您不能将它们包含在脚本中。
我有很多虚拟主机,想在脚本中使用输出 (sigh),所以这里有一些更长的东西,但应该足够健壮那个目的:
nginx -T | sed -r -e 's/[ \t]*$//' -e 's/^[ \t]*//' -e 's/^#.*$//' -e 's/[ \t]*#.*$//' -e '/^$/d' | \
sed -e ':a;N;$!ba;s/\([^;\{\}]\)\n/ /g' | \
grep -P 'server_name[ \t]' | grep -v '$' | grep '\.' | \
sed -r -e 's/(\S)[ \t]+(\S)/\n/g' -e 's/[\t ]//g' -e 's/;//' -e 's/server_name//' | \
sort | uniq | xargs -L1
由于它很长 \
-y,我将对每一行进行快速解释。
- 让 nginx 打印它的整个配置(这样我们就不必担心要包含哪些文件)并对其进行清理:删除前导和尾随 space、注释(包括尾随的)和空白行。
- 没有以分号或大括号结尾的每一行都应该继续,所以我们替换任何前面没有
;
、{
或 [= 的 \n
17=] 与 space。这需要使用 sed 的怪人 :a;N;$!ba;
抓取整个文件的技巧,以及一些分组以便我们可以用 </code> 放回最后一个字符,再加上一堆额外的反斜杠。</li>
<li>现在我们可以提取每个 <code>server_name
行,进行一些额外的检查以删除 nginx 变量 ($foo
),并且只包含有效域(即不包括 localhost
和 _
).
- 单词之间的任何 tabs/spaces 都会变成回车符 returns,然后我们删除多余的 spaces(以防万一)、分号和
server_name
部分.
- 最后对其进行排序,统一化并使用
xargs -L1
删除顶部的单个空白行。
请注意,这里有一些位技术上加倍,但我希望尽可能清晰和稳健。不过,欢迎提出改进建议。
除了所有其他出色的解决方案之外,如果您只需要每行一个所有名称的简单列表,例如:
example.com
my.example.com
etc.com
解析配置。获取带有 server_name
的所有行。删除 server_name
。最后每行放一个域。
sudo nginx -T | grep "server_name " | sed 's/.*server_name \(.*\);//' | sed 's/ /\n/'
@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'
分块:
perl -l -n -0777 -e
-l
: 使 print
命令以换行符终止其输出;
它还会导致在读取每个输入记录时删除尾随换行符,但这不会打扰我们,因为我们:
-n -0777
: Slurp all input into $_
in a go (one record);
-e
: 简单地执行下一个参数作为 Perl 源代码;
$, = $\ ;
使 print
命令在其每个参数之间也输出一个换行符;
s/^\s*#.*\n//mg ;
删除所有评论;
忽略前导空格,假定注释从开始到 运行 一直到行尾(.
不匹配此处的换行符);
m/\bserver_name\s++(.*?)\s*;/sg
生成所有 server_name ... ;
声明之间的所有内容(.
是否匹配此处的换行符);
... 全部 map
-ped 到:
map m/(\S+)/g,
...这将只留下连续的非空白块;
... 然后 grep
-ped 的唯一性 not 是特殊的“_
”服务器名称,
grep !$u{$_}++ && !m/^_$/,
... 和 print
-ed(未排序)。
grep server_name /etc/nginx/sites-enabled/* -RiI | grep -v "#" | awk -F ' ' ' { print "\n" "\n" }' | sort | uniq
是否有一个命令可以列出 CentOS 上 nginx 下的所有虚拟主机或服务器 运行?我想将结果通过管道传输到文本文件以用于报告目的。
我正在寻找类似于我用于 Apache 的命令的东西:
apachectl -S 2>&1 | grep 'port 80'
更新: 感谢@Putnik 指出了一种更简单的方法(但我更喜欢只列出已启用的站点):
grep server_name /etc/nginx/sites-enabled/* -RiI
旧Post:
尝试这样的事情:
find /etc/nginx/sites-enabled/ -type f -print0 | xargs -0 egrep '^(\s|\t)*server_name'
希望对您有所帮助!
grep server_name /etc/nginx/* -RiI
恕我直言,打字比@Haubix 的回答快得多。
可选添加|grep -v "#"
您可以使用以下方法一次一行列出域
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
}
从版本 1.9.2 开始,您可以:
nginx -T
显示完整的 nginx 配置
nginx -T | grep "server_name " #include the whitespace to exclude non relevant results
显示所有服务器名称
到目前为止的答案都有效,除了 如果你有 server_name
指令 运行 多行,然后它会默默地失败。它们似乎也是为人类消费而编写的(选择额外的行,例如 server_name_in_redirect off;
),因此您不能将它们包含在脚本中。
我有很多虚拟主机,想在脚本中使用输出 (sigh),所以这里有一些更长的东西,但应该足够健壮那个目的:
nginx -T | sed -r -e 's/[ \t]*$//' -e 's/^[ \t]*//' -e 's/^#.*$//' -e 's/[ \t]*#.*$//' -e '/^$/d' | \
sed -e ':a;N;$!ba;s/\([^;\{\}]\)\n/ /g' | \
grep -P 'server_name[ \t]' | grep -v '$' | grep '\.' | \
sed -r -e 's/(\S)[ \t]+(\S)/\n/g' -e 's/[\t ]//g' -e 's/;//' -e 's/server_name//' | \
sort | uniq | xargs -L1
由于它很长 \
-y,我将对每一行进行快速解释。
- 让 nginx 打印它的整个配置(这样我们就不必担心要包含哪些文件)并对其进行清理:删除前导和尾随 space、注释(包括尾随的)和空白行。
- 没有以分号或大括号结尾的每一行都应该继续,所以我们替换任何前面没有
;
、{
或 [= 的\n
17=] 与 space。这需要使用 sed 的怪人:a;N;$!ba;
抓取整个文件的技巧,以及一些分组以便我们可以用</code> 放回最后一个字符,再加上一堆额外的反斜杠。</li> <li>现在我们可以提取每个 <code>server_name
行,进行一些额外的检查以删除 nginx 变量 ($foo
),并且只包含有效域(即不包括localhost
和_
). - 单词之间的任何 tabs/spaces 都会变成回车符 returns,然后我们删除多余的 spaces(以防万一)、分号和
server_name
部分. - 最后对其进行排序,统一化并使用
xargs -L1
删除顶部的单个空白行。
请注意,这里有一些位技术上加倍,但我希望尽可能清晰和稳健。不过,欢迎提出改进建议。
除了所有其他出色的解决方案之外,如果您只需要每行一个所有名称的简单列表,例如:
example.com
my.example.com
etc.com
解析配置。获取带有 server_name
的所有行。删除 server_name
。最后每行放一个域。
sudo nginx -T | grep "server_name " | sed 's/.*server_name \(.*\);//' | sed 's/ /\n/'
@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'
分块:
perl -l -n -0777 -e
-l
: 使 print
命令以换行符终止其输出;
它还会导致在读取每个输入记录时删除尾随换行符,但这不会打扰我们,因为我们:
-n -0777
: Slurp all input into $_
in a go (one record);
-e
: 简单地执行下一个参数作为 Perl 源代码;
$, = $\ ;
使 print
命令在其每个参数之间也输出一个换行符;
s/^\s*#.*\n//mg ;
删除所有评论;
忽略前导空格,假定注释从开始到 运行 一直到行尾(.
不匹配此处的换行符);
m/\bserver_name\s++(.*?)\s*;/sg
生成所有 server_name ... ;
声明之间的所有内容(.
是否匹配此处的换行符);
... 全部 map
-ped 到:
map m/(\S+)/g,
...这将只留下连续的非空白块;
... 然后 grep
-ped 的唯一性 not 是特殊的“_
”服务器名称,
grep !$u{$_}++ && !m/^_$/,
... 和 print
-ed(未排序)。
grep server_name /etc/nginx/sites-enabled/* -RiI | grep -v "#" | awk -F ' ' ' { print "\n" "\n" }' | sort | uniq