Nginx - 需要存取共享功能的多個虛擬主機

Nginx - 需要存取共享功能的多個虛擬主機

我在 1 docroot 下有一些 php 應用程序,如下所示:

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

我想從上面的目錄建立一些虛擬主機,使文檔根變成:

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

這些虛擬主機需要存取 /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) 有一個有效的目錄,上述配置就可以工作。問題是,如果我在 /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;
        }
}

相關內容