Eu tenho dois diretórios dos quais preciso servir ativos estáticos:
/srv/web
: recursos estáticos que incluem imagens, JavaScript, HTML etc./srv/php
: Scripts PHP dinâmicos juntamente com alguns ativos estáticos.
Estou usando o NGINX e configurei assim:
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;
}
}
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, caso contrário /srv/php
, retorne 404. Todos os arquivos que terminam em \.php$
serão solicitados do PHP FPM pelo soquete Unix, e isso está funcionando.
O problema que estou tendo atualmente é que a index
diretiva sobre o server
não está funcionando como planejado. Eu tenho um index.html
arquivo 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 de sistema de arquivos para servir ao lado do PHP? Alguma ideia 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 conforme planejado e obter /subdir/
com seu índice funciona bem, mas se eu GET /
, recebo um 403 proibido e o nginx reclama da listagem de diretórios:
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 pelo menos cheira a progresso.
Múltiplas raízes não funcionarão assim
Com esta configuração:
Não há nenhum processamento de solicitação que usaria a diretiva index, conforme escrito, a solicitação deve corresponder a um arquivo. Usar o log de depuração confirma isso:
Usando uma
try_files
diretiva que procura diretórios como este:também não funciona:
Observe que a "raiz" está confusa,
try_files
espera uma url e não um caminho de arquivo. Sugiro não continuar tentando usar uma solução desse tipo - especialmente não definindo o root como/
e potencialmente permitindo o 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:
Esta configuração serve todo o conteúdo php:
Basta juntá-los:
Uma pegadinha é que, com esse tipo de configuração, uma solicitação que corresponda a uma pasta na
/srv/web
qual não haja umindex.html
arquivo gerará um erro 403 (já que a solicitação é para um diretório e não há arquivo de índice de diretório). Para permitir que essas solicitações também sejam tratadas pelo php - é necessário redirecionar os erros 403 para o manipulador do php.