Nginx - 共有機能へのアクセスを必要とする複数の仮想ホスト

Nginx - 共有機能へのアクセスを必要とする複数の仮想ホスト

以下のように、1 つの docroot の下にいくつかの PHP アプリケーションがあります。

/data/app/
|-- antispam.php
|-- api
|   `-- functions.php
|-- images
|-- messaging
|-- parents
|   `-- index.php
`-- students
    `-- index.php

上記のディレクトリから、docroot が次のようになるような仮想ホストを作成したいと思います。

/data/app/parents : parents.example.com 
/data/app/students : students.example.com

これらの vhost は、/data/app (antispam.php、api/functions.php、messaging/ & images/) からの共有機能にアクセスする必要があります。

私の nginx 設定からの抜粋: parents.example.com

server {
        listen 80;
        server_name  parents.example.com;
        root   /data/app/parents;
        index index.php ;
        access_log /var/log/nginx/example.com.log combined;
        location ~ ^/api { root /data/app/; }
        location ~ ^/images { root /data/app/; }
        location ~ ^/antispam.php {  alias /data/app/antispam.php ; 
                include fastcgi_params;
                fastcgi_param   SCRIPT_FILENAME $request_filename;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
        }
}

上記の構成は、場所を定義し、docroot (/data/app) に有効なディレクトリがある限り機能します。問題は、vhost に必要な /data/app に 100 個のディレクトリ (PHP スクリプトを含む) がある場合、それらをそれぞれ Nginx サーバー ブロックで定義する必要があるかどうかです。場所ブロックで何も定義されていない場合は、404 をコミットする前に、まず /data/app/ を検索するのではないかと思いました。おそらく try_files のようなものでしょう。

答え1

ファイルシステム上でシンボリック リンクを使用することをお勧めします。これにより、 は/data/app/parents/antispam.phpを指すシンボリック リンクになります../antispam.php。サブディレクトリでも同じ操作を実行できます。

答え2

server_name ディレクティブで変数を使用し、それを root ディレクティブを含む他のディレクティブで再利用できます。

したがって、次のように、単一のブロックを使用して無限のサブドメインを定義できるはずです。

server {
        listen 80;
        server_name  ~(?<subdomain>^.*?)\.?example\.com;
        root   /data/app/$subdomain;
        index index.php;
        access_log /var/log/nginx/$subdomain.example.com.log combined;

        location /api/ {
            root /data/app;
        }

        location /images/ {
            root /data/app;
        }
        location ~ \/antispam.php$ { 
            alias /data/app/antispam.php ; 
            include fastcgi_params;
            fastcgi_param   SCRIPT_FILENAME $request_filename;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
        }
}

関連情報