Mehrere Verzeichnisse für statische Dateien, einzelner PHP-FPM-Server

Mehrere Verzeichnisse für statische Dateien, einzelner PHP-FPM-Server

Ich habe zwei Verzeichnisse, aus denen ich statische Assets bereitstellen muss:

  1. /srv/web: Statische Assets, darunter Bilder, JavaScript, HTML usw.
  2. /srv/php: Dynamische PHP-Skripte neben einigen statischen Assets.

Ich verwende NGINX und habe es wie folgt konfiguriert:

server {
    listen 80;
    server_name _;

    # root /;
    index index.php index.html index.htm;
    try_files /srv/web/$uri /srv/php/$uri =404;

    location ~ \.php$ {
        root /srv/php;
        try_files $uri =404;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
#       fastcgi_param SCRIPT_FILENAME /srv/php$fastcgi_script_name;
        include fastcgi_params;
    }
}

Ich verwende Ubuntu 14.04, die PHP FPM-Paketversion ist 5.5.9, die NGINX-Paketversion ist 1.4.6.

Das einfache Ziel besteht hier darin, statische Dateien zuerst von bereitzustellen /srv/web, andernfalls /srv/phpwird 404 zurückgegeben. Alle Dateien mit der Endung \.php$werden über den Unix-Socket von PHP FPM angefordert, und das funktioniert.

Das Problem, das ich derzeit habe, ist, dass die indexDirektive für servernicht wie geplant funktioniert. Ich habe eine index.htmlDatei in /srv/web, und wenn ich

curl -is http://localhost/

Ich bekomme eine 404.

Ist dies die beste Möglichkeit, eine NGINX-Site mit mehreren Dateisystemordnern einzurichten, die neben PHP bereitgestellt werden? Irgendwelche Ideen, warum mein statischer Index nicht funktioniert?


Aktualisieren

Gemäß der Antwort von AD7six unten habe ich meine Konfiguration aktualisiert, sodass sie folgendermaßen aussieht:

server {
    listen 80;
    server_name _; # listen at all host names

    # serve static files first from /srv/web, then from /srv/php, and any dynamic PHP files from
    # FastCGI/FPM at the Unix socket.
    location / {
        root /srv/web;
        index index.html index.htm;
        try_files $uri $uri/ @php;
    }

    location @php {
        root /srv/php;
        index index.php;
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        root /srv/php;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /srv/php/$fastcgi_script_name;
        include fastcgi_params;
    }
}

Mein Verzeichniseintrag sieht folgendermaßen aus:

/srv/
|-- php
|   |-- demo.php
|   |-- index.php
|   `-- phpstatic.txt
`-- web
    |-- static.html
    `-- subdir
        `-- index.html

3 directories, 5 files

Das Abrufen von statischen Dateien und PHP-Dateien funktioniert wie geplant und auch das Abrufen /subdir/mit dem Index funktioniert einwandfrei. Wenn ich jedoch „GET“ ausführe /, erhalte ich eine 403-Fehlermeldung und nginx beschwert sich über die Verzeichnisauflistung:

2015/08/24 21:50:59 [error] 9159#0: *7 directory index of "/srv/web/" is forbidden, client: 127.0.0.1, server: _, request: "GET / HTTP/1.1", host: "localhost"

Ich bin nicht sicher, warum das fehlschlägt, aber es riecht zumindest nach Fortschritt.

Antwort1

Mehrere Wurzeln funktionieren so nicht

Mit dieser Konfiguration:

server {
    # root /;
    index index.php index.html index.htm;
    try_files /srv/web/$uri /srv/php/$uri =404;

Es gibt keine Anfrageverarbeitung, die die Indexdirektive verwenden würde, da die Anfrage in ihrer Schreibweise mit einer Datei übereinstimmen muss. Die Verwendung des Debugprotokolls bestätigt dies:

2015/08/24 08:12:11 [debug] 17173#0: *26 try files phase: 13
2015/08/24 08:12:11 [debug] 17173#0: *26 http script copy: "/srv/web/"
2015/08/24 08:12:11 [debug] 17173#0: *26 http script var: "/"
2015/08/24 08:12:11 [debug] 17173#0: *26 trying to use file: "/srv/web//" "/srv/web//"
2015/08/24 08:12:11 [debug] 17173#0: *26 http script copy: "/srv/php/"
2015/08/24 08:12:11 [debug] 17173#0: *26 http script var: "/"
2015/08/24 08:12:11 [debug] 17173#0: *26 trying to use file: "/srv/php//" "/srv/php//"
2015/08/24 08:12:11 [debug] 17173#0: *26 trying to use file: "=404" "=404"

Verwenden Sie eine try_filesDirektive, die nach Verzeichnissen wie dieser sucht:

try_files /srv/web/$uri /srv/web/uri/ /srv/php/$uri /srv/php/$uri/ =404;

geht auch nicht:

2015/08/24 08:16:17 [debug] 17651#0: *33 http script copy: "/srv/web/"
2015/08/24 08:16:17 [debug] 17651#0: *33 http script var: "/srv/web//index.html"
2015/08/24 08:16:17 [debug] 17651#0: *33 trying to use file: "/srv/web//srv/web//index.html" "/srv/web//srv/web//index.html"
2015/08/24 08:16:17 [debug] 17651#0: *33 http script copy: "/srv/web/"
2015/08/24 08:16:17 [debug] 17651#0: *33 http script var: "/srv/web//index.html"
2015/08/24 08:16:17 [debug] 17651#0: *33 trying to use dir: "/srv/web//srv/web//index.html" "/srv/web//srv/web//index.html"
2015/08/24 08:16:17 [debug] 17651#0: *33 http script copy: "/srv/php/"
2015/08/24 08:16:17 [debug] 17651#0: *33 http script var: "/srv/web//index.html"
2015/08/24 08:16:17 [debug] 17651#0: *33 trying to use file: "/srv/php//srv/web//index.html" "/srv/php//srv/web//index.html"
2015/08/24 08:16:17 [debug] 17651#0: *33 http script copy: "/srv/php/"
2015/08/24 08:16:17 [debug] 17651#0: *33 http script var: "/srv/web//index.html"
2015/08/24 08:16:17 [debug] 17651#0: *33 trying to use dir: "/srv/php//srv/web//index.html" "/srv/php//srv/web//index.html"
2015/08/24 08:16:17 [debug] 17651#0: *33 trying to use file: "=404" "=404"

Beachten Sie, dass die "root" verwirrt ist und try_fileseine URL und keinen Dateipfad erwartet. Ich schlage vor, nicht weiter zu versuchen, eine Lösung dieser Art zu verwenden - insbesonderenichtSetzen der Wurzel als /undmöglicherweiseErmöglicht den Zugriff auf alle Dateien auf dem Server.

Zwei Standortblöcke verwenden

Halten Sie die Dinge stattdessen einfach. Diese Konfiguration stellt den gesamten statischen Inhalt bereit:

    root /srv/web;
    index index.html;
    try_files $uri $uri/;

Diese Konfiguration stellt den gesamten PHP-Inhalt bereit:

    root /srv/php;
    index index.php;
    try_files $uri $uri/;

Setzen Sie sie einfach zusammen:

location / {
    root /srv/web;
    index index.html;
    try_files $uri $uri/ @php;
    error_page 403 = @php; # see note below
}

location @php {
    root /srv/php;
    index index.php;
    try_files $uri $uri/ =404;
}

location ~ \.php$ {
    # as before
}

Ein Problem ist, dass bei dieser Art von Setup eine Anfrage, die auf einen Ordner zutrifft, unter /srv/webdemnichthave an index.htmlfile wird einen 403-Fehler auslösen (da die Anfrage sich auf ein Verzeichnis bezieht und keine Verzeichnisindexdatei vorhanden ist). Damit diese Anfragen auch von PHP bearbeitet werden können, müssen 403-Fehler an den PHP-Handler umgeleitet werden.

verwandte Informationen