1

Debian で nginx を使用しています。そのため、メインの構成ファイル /etc/nginx/nginx.conf の他に、vhost 構成ファイルを含む /etc/nginx/sites-available/ フォルダーと、アクティブな vhosts へのリンクを含む /etc/nginx/sites-enabled/ フォルダーがあります。

それでは、まず私の質問をさせてください。説明が長いので、読む必要はないかもしれません...


次のようないくつかの vhost テンプレートを使用できるようにしたい:

server {
    listen   80;
    server_name ~^(?<project>.+)\.(?<area>.+)\.loc$;

    if ($host ~ ^(?<project>.+)\.(?<area>.+)\.loc$) {
        set $folder "$area/$project";
    }
    ...
    access_log /var/log/nginx/$area/$project.access.log;
    error_log /var/log/nginx/error.log;
    ...
    root /var/www/$folder/;
    ...
}

どの仮想ホストがどのテンプレートに基づいているかを定義します。さらに、仮想ホストに新しい設定を追加し、テンプレートから継承された設定を再定義できるように、テンプレートを「拡張」する可能性があると便利です。

どうすれば達成できますか?


現在の vhost ファイル構造は次のようになります。

/etc/nginx/sites-available には、次のファイルが含まれています。

default (デフォルト vhost) ax-common-vhost (vhost テンプレート) test.sandbox.loc (テンプレート ax-common-vhost に基づく vhost;includeルールと共にそれが含まれます) ...さらにいくつか...

/etc/nginx/sites-available には、次のファイルが含まれています。

デフォルト -> /etc/nginx/sites-available/default test.sandbox.loc -> /etc/nginx/sites-available/test.sandbox.loc ...さらにいくつか...

テンプレート ax-common-vhost は、サーバー名を使用して、ルート フォルダーなどのいくつかのオプションを動的に定義します。

server {
    listen   80;
    server_name ~^(?<project>.+)\.(?<area>.+)\.loc$;

    if ($host ~ ^(?<project>.+)\.(?<area>.+)\.loc$) {
        set $folder "$area/$project";
    }
    ...
    access_log /var/log/nginx/$area/$project.access.log;
    error_log /var/log/nginx/error.log;
    ...
    root /var/www/$folder/;
    ...
}

したがって、新しい vhost を作成する場合は、新しい vhost ファイルとそのリンクを作成するだけで済みます。設定をコピーして貼り付けたり、パスを手動で設定したりする必要はありません。ホスト %project%.%area%.loc を [my webroot]/%area%/%project% に配置する必要があるという規則に従うだけです。

私は思った、それはインクルード ルールで動作します: サーバーはリクエスト xyloc を取得し、その名前のファイルを探し、ファイルを開き、最終的にその中のディレクティブを処理します (インクルード ディレクティブとインクルードされたテンプレートのコンテンツ全体)。 .

しかし、そうではありません。Nginx は、フォルダー全体 /etc/nginx/sites-available/ (アルファベット順?) をスキャンし、最初のファイル /serverディレクティブを要求のホスト名が等しい/一致するように保持するだけのようです。

つまり、インクルード

include /etc/nginx/sites-available/ax-common-vhost;

使用されません。実際、vhost ファイルから include ディレクティブを削除しましたが、何も変わっていません!

そして、それは問題です。たとえば、Zend Framework プロジェクト ([プロジェクト ルート]/public/ をルートとして) 用に新しいテンプレートを追加すると、次のようになります。

ファイルax-zf-vhost

server {
    listen   80;
    server_name ~^(?<project>.+)\.(?<area>.+)\.loc$;

    if ($host ~ ^(?<project>.+)\.(?<area>.+)\.loc$) {
        set $folder "$area/$project";
    }
    ...
    access_log /var/log/nginx/$area/$project.access.log;
    error_log /var/log/nginx/error.log;
    ...
    root /var/www/$folder/public/;
    ...
}

...、サーバーは vhost myzf.sandbox.loc が ax-zf-vhost に基づいているという情報を取得しないため、無視されます。これの代わりに、/etc/nginx/sites-available/ フォルダーをループし、ax-common-vhost を見つけ、myzf.sandbox.loc がパターン ^(?.+).(?.+).loc$ に一致します。 nginx は myzf.sandbox.loc に ax-common-vhost を使用します。

この問題はどのように解決できますか?

ありがとう

4

1 に答える 1

1

OK、今はうまくいきます!

基本的なvhostファイルのserver_nameブロックを変更したので、ディレクティブにリストされているホスト名を持つリクエストのみを取得します。

ファイルax-common-vhost:

server {
    listen   80;
    server_name test.sandbox.loc foo.sandbox.loc bar.sandbox.loc;
    ...
}

ジェネリックの代わりにserver_name ~^(?<project>.+)\.(?<area>.+)\.loc$;

/ etc / nginx / sites-available /内のvhostファイルtest.sandbox.loc、foo.sandbox.loc、bar.sandbox.locなど、および/ etc / nginx /sites-enabled/内のそれらへのリンクは必要ありませんもう。代わりに、/ etc / nginx / sites-enabled/ax-common-vhostから/etc/ nginx / sites-available/ax-common-vhostへのリンクを作成しました。

2番目の一般的なvhostファイルのアプローチは同じであり、機能します。

最初の問題は解決されました。設定は複数のvhosts/サーバーブロックで共有でき、設定を複製せずに新しいvhostsを簡単に追加できます。

ただし、設定されたvhostファイルを別のファイルで拡張することはできません。これを行うことで、ファイルBがファイルAを「拡張」し、その設定を継承し、ディレクティブ/ルールのみを上書きできるようにすることは可能ですか?どうすればそれを実現できますか?

于 2013-02-07T13:16:45.053 に答える