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: Родители.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
задан 12 September 2018 в 02:16
2 ответа

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

0
ответ дан 4 December 2019 в 03:40

Вы можете использовать переменные в директиве 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;
        }
}
0
ответ дан 4 December 2019 в 03:40

Теги

Похожие вопросы