簡體   English   中英

如何列出 nginx 中的所有虛擬主機

[英]How can I list all vhosts in nginx

是否有一個命令可以列出 CentOS 上在 nginx 下運行的所有虛擬主機或服務器? 我想將結果通過管道傳輸到文本文件以用於報告目的。

我正在尋找類似於我用於 Apache 的這個命令的東西:

apachectl -S 2>&1 | grep '端口 80'

從版本 1.9.2 開始,您可以執行以下操作:

nginx -T

顯示完整的 nginx 配置

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

向您展示所有服務器名稱

更新:感謝@Putnik 指出一個更簡單的方法(但我更喜歡只列出啟用站點):

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

舊帖子:

嘗試這樣的事情:

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

希望有幫助!

到目前為止的答案都是有效的,除非您在多行上運行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/\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 的怪人:a;N;$!ba; 抓住整個文件技巧,以及一些分組,以便我們可以用\\1放回最后一個字符,再加上一堆額外的反斜杠以求好運。
  3. 現在我們可以拉出每個server_name行,通過一些額外的檢查來刪除 nginx 變量( $foo )並且只包含有效的域(即不是localhost_ )。
  4. 單詞之間的任何制表符/空格都會變成回車,然后我們刪除多余的空格(以防萬一)、分號和server_name部分。
  5. 最后對其進行排序,對其進行統一化並使用xargs -L1刪除頂部的單個空行。

請注意,這里有一些位在技術上加倍,但我希望盡可能清晰和穩健。 不過,歡迎提出改進建議。

grep server_name /etc/nginx/* -RiI

恕我直言,打字比@Haubix 的回答快得多。 添加|grep -v "#"可選

除了所有其他出色的解決方案,如果您只需要每行一個所有名稱的簡單列表,例如:

example.com
my.example.com
etc.com

解析配置。 獲取所有帶有server_name行。 刪除server_name 最后每行放一個域。

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

@anthony-briggs正確地指出,如果您的server_name ... ;這里給出的大多數其他答案都不起作用server_name ... ; 聲明分布在多行中。

但是,如果您負擔得起擁有perl解釋器的奢侈,您可以將他的解決方案縮短為這個 oneliner:

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-n -0777所有輸入放入$_中(一條記錄);

-e : 簡單地將下一個參數作為 Perl 源執行;


$, = $\ ;

使print命令還在其每個參數之間輸出一個換行符;


s/^\s*#.*\n//mg ;

刪除所有評論;

忽略前導空格,假定注釋從開始並運行到行尾( .不匹配此處的換行符);


m/\bserver_name\s++(.*?)\s*;/sg

生成所有server_name ... ;之間的所有內容server_name ... ; 聲明( .匹配換行符這里);


...都map到:

map m/(\S+)/g, 

...只留下連續的非空白塊;


...然后grep -ped 以獲得唯一性,而不是特殊的“ _ ”服務器名稱,

grep !$u{$_}++ && !m/^_$/, 

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

您可以使用以下命令一次一行地列出域

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
}
grep server_name /etc/nginx/sites-enabled/* -RiI | grep -v "#" | awk -F ' ' ' { print $3 "\n" $4  "\n" $5 }' | sort | uniq

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM