web-dev-qa-db-ja.com

nginxのすべてのvhostをリストするにはどうすればよいですか

CentOSのnginxで実行されているすべての仮想ホストまたはサーバーを一覧表示するコマンドはありますか?レポート作成のために、結果をテキストファイルにパイプで渡したいと思います。

私はApacheに使用するこのコマンドに似たものを探しています:

apachectl -S 2>&1 | grep 'ポート80'

27
Corgalore

更新:より簡単な方法を指摘してくれた@Putnikに感謝します(ただし、サイトが有効になっているサイトのみをリストすることを好みます)。

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

古い投稿:

次のようなものを試してください:

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

お役に立てば幸いです!

28

バージョン1.9.2以降では、次のことができます。

nginx -T

完全なnginx設定を表示

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

すべてのサーバー名を表示します

46
Alessio

これまでの答えはうまくいきますexceptserver_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を使用して上部の単一の空白行を削除します。

ここには技術的に倍になるいくつかのビットがあることに注意してください。ただし、改善の提案は歓迎します。

19
Anthony Briggs

grep server_name /etc/nginx/* -RiI

@Haubixの答えよりも入力がずっと速い。追加 |grep -v "#"オプション

14
Putnik

他のすべての優れたソリューションに加えて、次のように、1行に1つのすべての名前の単純なリストが必要な場合:

example.com
my.example.com
etc.com

構成を解析します。 server_nameですべての行を取得します。 server_nameを削除します。最後に、1行に1つのドメインを配置します。

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

以下を使用して、一度に1行ずつドメインをリストできます。

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
}
0
doublesharp