Назад | Перейти на главную страницу

Несколько каталогов статических файлов, один сервер PHP FPM

У меня есть два каталога, из которых мне нужно обслуживать статические ресурсы:

  1. /srv/web: Статические ресурсы, которые включают изображения, JavaScript, HTML и т. Д.
  2. /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.