Nginx – vários vhost que requerem acesso à função compartilhada

Nginx – vários vhost que requerem acesso à função compartilhada

eu tenho algum aplicativo php em 1 docroot como abaixo:

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

eu quero criar algum vhost do diretório acima, de modo que o docroot se torne:

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

esses vhost precisarão de acesso a alguma função compartilhada de /data/app (antispam.php , api/functions.php, messages/ & images/)

algum trecho da minha configuração do nginx: pais.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;
        }
}

a configuração acima funciona desde que eu tenha definido o local e o docroot (/data/app) tenha um diretório válido. o problema é que se eu tiver 100 diretórios (contêm script PHP) em/data/app exigidos por um vhost, devo definir cada um deles no bloco do servidor Nginx? Eu me perguntei se nenhum definido no bloco de localização, ele pesquisaria em /data/app/ primeiro antes de confirmar 404, algo como try_files talvez.

Responder1

Eu sugiro que você use links simbólicos no sistema de arquivos para que /data/app/parents/antispam.phpseja um link simbólico apontando para ../antispam.php. Você pode fazer o mesmo com subdiretórios.

Responder2

Você pode usar variáveis ​​em uma diretiva server_name e reutilizá-las em outras diretivas, incluindo a diretiva root.

Portanto, você poderá definir subdomínios infinitos usando um único bloco, algo assim:

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

informação relacionada