
Ich habe zwei Verzeichnisse, aus denen ich statische Assets bereitstellen muss:
/srv/web
: Statische Assets, darunter Bilder, JavaScript, HTML usw./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/php
wird 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 index
Direktive für server
nicht wie geplant funktioniert. Ich habe eine index.html
Datei 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_files
Direktive, 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_files
eine 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/web
demnichthave an index.html
file 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.