Nginx — несколько виртуальных хостов, которым требуется доступ к общей функции

Nginx — несколько виртуальных хостов, которым требуется доступ к общей функции

У меня есть несколько PHP-приложений в 1 docroot, как показано ниже:

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

Я хочу создать некоторый vhost из вышеуказанного каталога, чтобы 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) имеет допустимый каталог. Проблема в том, что если у меня есть 100 каталогов (содержащих PHP-скрипт) в /data/app, которые требуются vhost, должен ли я определять каждый из них в блоке сервера Nginx? Мне было интересно, что если ни один из них не определен в блоке местоположения, он сначала будет искать в /data/app/ перед фиксацией 404, что-то вроде try_files, возможно.

решение1

Я предлагаю вам использовать символические ссылки в файловой системе, чтобы это /data/app/parents/antispam.phpбыла символическая ссылка, указывающая на ../antispam.php. Вы можете сделать то же самое с подкаталогами.

решение2

Вы можете использовать переменные в директиве server_name, а затем повторно использовать их в других директивах, включая корневую директиву.

Таким образом, вы сможете определить бесконечное количество поддоменов, используя один блок, например так:

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;
        }
}

Связанный контент