Nginx - mehrere virtuelle Hosts, die Zugriff auf gemeinsam genutzte Funktionen benötigen

Nginx - mehrere virtuelle Hosts, die Zugriff auf gemeinsam genutzte Funktionen benötigen

ich habe einige PHP-Anwendungen unter 1 Docroot wie unten:

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

ich möchte aus dem obigen Verzeichnis einen virtuellen Host erstellen, sodass das Docroot wie folgt aussieht:

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

Diese virtuellen Hosts benötigen Zugriff auf einige gemeinsam genutzte Funktionen von /data/app (antispam.php, api/functions.php, messaging/ und images/).

ein paar Ausschnitte aus meiner Nginx-Konfiguration: 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;
        }
}

Die obige Konfiguration funktioniert, solange ich den Speicherort definiert habe und das Docroot (/data/app) ein gültiges Verzeichnis hat. Das Problem ist, wenn ich 100 Verzeichnisse (enthalten PHP-Skripte) in /data/app habe, die von einem virtuellen Host benötigt werden, sollte ich dann jedes davon im Nginx-Serverblock definieren? Ich habe mich gefragt, ob, wenn im Speicherortblock keines definiert ist, zuerst in /data/app/ gesucht wird, bevor 404 übermittelt wird, vielleicht so etwas wie try_files.

Antwort1

Ich schlage vor, dass Sie symbolische Links im Dateisystem verwenden, sodass /data/app/parents/antispam.phpein symbolischer Link auf verweist ../antispam.php. Dasselbe können Sie mit Unterverzeichnissen tun.

Antwort2

Sie können Variablen in einer Servername-Direktive verwenden und diese dann in anderen Direktiven, einschließlich der Root-Direktive, wiederverwenden.

Sie sollten also in der Lage sein, eine unendliche Anzahl an Subdomänen mit einem einzigen Block zu definieren, etwa so:

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

verwandte Informationen