У меня есть два каталога, из которых мне нужно обслуживать статические ресурсы:
/srv/web
: Статические ресурсы, которые включают изображения, JavaScript, HTML и т. Д./srv/php
: Динамические скрипты PHP вместе с некоторыми статическими ресурсами.Я использую NGINX и настроил его так:
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;
}
}
Я использую Ubuntu 14.04, версия пакета PHP FPM - 5.5.9, версия пакета NGINX - 1.4.6.
Простая цель здесь - обслуживать статические файлы из /srv/web
во-первых, если это не удается /srv/php
, в противном случае вернуть 404. Все файлы, заканчивающиеся на \.php$
будет запрошен из PHP FPM через сокет Unix, и это работает.
Проблема, с которой я сейчас сталкиваюсь, заключается в том, что index
директива о server
работает не так, как планировалось. у меня есть index.html
файл в /srv/web
, и когда я это сделаю
curl -is http://localhost/
Я получаю 404.
Является ли это наиболее идеальным способом создания сайта NGINX с несколькими папками файловой системы для обслуживания вместе с PHP? Есть идеи, почему мой статический индекс не работает?
В соответствии с ответом AD7six ниже, я обновил свою конфигурацию, чтобы она выглядела следующим образом:
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;
}
}
Список моих каталогов выглядит так:
/srv/
|-- php
| |-- demo.php
| |-- index.php
| `-- phpstatic.txt
`-- web
|-- static.html
`-- subdir
`-- index.html
3 directories, 5 files
Получение статических файлов и файлов PHP работает по плану и /subdir/
со своим индексом работает нормально, но если я ПОЛУЧАЮ /
, Я получаю 403 запрещено, и nginx жалуется на список каталогов:
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"
Не уверен, почему это не удается, но, по крайней мере, это пахнет прогрессом.
С этой конфигурацией:
server {
# root /;
index index.php index.html index.htm;
try_files /srv/web/$uri /srv/php/$uri =404;
Нет обработки запроса, которая использовала бы директиву index, поскольку написано, что запрос должен соответствовать файлу. Использование журнала отладки подтверждает это:
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"
Используя try_files
директива, которая ищет такие каталоги:
try_files /srv/web/$uri /srv/web/uri/ /srv/php/$uri /srv/php/$uri/ =404;
тоже не работает:
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"
Обратите внимание, что "корень" перепутан, try_files
ожидает URL-адрес, а не путь к файлу. Предлагаю не продолжать попытки использовать такие решения, особенно не установка корня как /
и потенциально разрешение доступа к любому файлу на сервере.
Вместо этого сохраняйте простоту. Эта конфигурация будет обслуживать весь статический контент:
root /srv/web;
index index.html;
try_files $uri $uri/;
Эта конфигурация обслуживает все содержимое php:
root /srv/php;
index index.php;
try_files $uri $uri/;
Просто сложите их вместе:
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
}
Одна проблема заключается в том, что при такой настройке запрос, который соответствует папке в /srv/web
который не есть index.html
file выдаст ошибку 403 (поскольку запрос относится к каталогу, а индексный файл каталога отсутствует). Чтобы эти запросы также обрабатывались php, необходимо перенаправить ошибку 403 обработчику php.