Vários diretórios de arquivos estáticos, único servidor PHP FPM

2

Eu tenho dois diretórios dos quais preciso fornecer ativos estáticos:

  1. /srv/web : recursos estáticos que incluem imagens, JavaScript, HTML, etc.
  2. /srv/php : scripts PHP dinâmicos ao lado de alguns recursos estáticos.

Estou usando o NGINX e o configurei da seguinte forma:

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

Eu estou no Ubuntu 14.04, a versão do pacote PHP FPM é 5.5.9, a versão do pacote NGINX é 1.4.6.

O objetivo simples aqui é servir arquivos estáticos de /srv/web primeiro, com falha /srv/php , caso contrário, retornar 404. Todos os arquivos terminados em \.php$ serão solicitados do PHP FPM sobre o soquete Unix e isso está funcionando.

O problema que estou tendo atualmente é que a diretiva index no server não está funcionando como planejado. Eu tenho um arquivo index.html em /srv/web , e quando eu faço

curl -is http://localhost/

Eu recebo um 404.

Esta é a maneira mais ideal de configurar um site NGINX com várias pastas do sistema de arquivos para servir juntamente com o PHP? Alguma idéia de por que meu índice estático não está funcionando?

Atualizar

De acordo com a resposta do AD7six abaixo, atualizei minha configuração para ficar assim:

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

Minha listagem de diretórios é assim:

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

3 directories, 5 files

Obter arquivos estáticos e arquivos PHP funciona como planejado e obter /subdir/ com seu índice funciona bem, mas se eu obtiver / , recebo uma proibição 403, e nginx reclama da listagem de diretório:

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"

Não sei por que isso está falhando, mas cheira a progresso, pelo menos.

    
por Naftuli Kay 24.08.2015 / 07:58

1 resposta

2

Várias raízes não funcionam assim

Com esta configuração:

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

Não há processamento de solicitação que use a diretiva de índice, pois a solicitação deve corresponder a um arquivo. Usando o log de depuração confirma isso:

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"

Usando uma diretiva try_files que procura diretórios como este:

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

também não funciona:

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"

Observe que a "raiz" é confusa, try_files espera que uma URL não seja um caminho de arquivo. Sugiro não continuar tentando usar uma solução desse tipo - especialmente não definindo a raiz como / e potencialmente permitindo acesso a qualquer arquivo no servidor.

Use dois blocos de localização

Em vez disso, mantenha as coisas simples. Esta configuração servirá todo o conteúdo estático:

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

Esta configuração serve todo o conteúdo do php:

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

Basta colocá-los juntos:

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
}

Uma pegadinha é que, com esse tipo de configuração, uma solicitação que corresponde a uma pasta em /srv/web , que não tem um arquivo index.html , lançará um erro 403 (como a solicitação é para um diretório e não há arquivo de índice de diretório). Para permitir que esses pedidos também sejam manipulados pelo php - é necessário redirecionar os erros 403 para o manipulador php.

    
por 24.08.2015 / 10:31