Nginx: múltiples vhost que requieren acceso a una función compartida

Nginx: múltiples vhost que requieren acceso a una función compartida

Tengo alguna aplicación PHP en 1 docroot como se muestra a continuación:

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

Quiero crear un vhost desde el directorio anterior de modo que docroot se convierta en:

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

esos vhost necesitarán acceso a alguna función compartida desde /data/app (antispam.php, api/functions.php, mensajería/ & imágenes/)

algún fragmento de mi configuración de nginx: padres.ejemplo.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;
        }
}

La configuración anterior funciona siempre que defina la ubicación y el docroot (/data/app) tenga un directorio válido. El problema es que si tengo 100 directorios (que contienen script PHP) en /data/app que requiere un vhost, ¿debería definir cada uno de ellos en el bloque del servidor Nginx? Me preguntaba que si no hay ninguno definido en el bloque de ubicación, buscará en /data/app/ primero antes de confirmar 404, tal vez algo así como try_files.

Respuesta1

Le sugiero que utilice enlaces simbólicos en el sistema de archivos para que /data/app/parents/antispam.phpsea un enlace simbólico que apunte a ../antispam.php. Puedes realizar lo mismo con los subdirectorios.

Respuesta2

Puede usar variables en una directiva server_name y luego reutilizarlas en otras directivas, incluida la directiva raíz.

Entonces deberías poder definir infinitos subdominios usando un solo bloque, algo como esto:

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

información relacionada