Você cometeu o erro habitual de as pessoas não entenderem como o nginx funciona. Lembre-se do seguinte:
O nginx sempre atende a um pedido com um único % somentelocation
.
Sugiro que você leia (novamente) o seguinte: Como o nginx processa uma solicitação
Agora, olhando para sua configuração, as solicitações de back-end precisam ser veiculadas por dois locais:
-
location /api
-
location ~\.php$
Seguindo a documentação location
, o primeiro é chamado de prefixo localização, enquanto o segundo é uma expressão regular (regex) um. O nginx irá verificar ambos, mas no final apenas selecionará um, que no seu caso é o regex.
Agora, ao processá-lo, o nginx encaminhará uma solicitação para /path/to/frontend/<yourFile>.php
para o PHP, construindo o caminho a partir de root /path/to/frontend
, já que é o único definido. O back-end falha, incapaz de encontrar o arquivo especificado.
Você pode tentar o seguinte:
location /api {
alias /path/to/backend;
index index.php;
try_files $uri $uri/ /index.php;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
# Useless? Request always ending up with '.php' here...
fastcgi_index index.php;
include fastcgi_params;
# Try to secure this block, which might lead to arbitrary code execution.
}
}
Quanto à falta de segurança, eu organizei uma palestra sobre nginx e PHP-FPM no nginx.conf 2014 final de outubro. Os slides estão disponíveis: link . Vídeo em breve disponível.