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 を使用します。
この問題はどのように解決できますか?
ありがとう