O Nginx pode manipular solicitações php (ou fcgi semelhantes) dentro de um alias?

4

Estou convertendo um servidor Apache legado em Nginx e não tenho o privilégio de alterar as URLs ou reorganizar o sistema de arquivos.

É possível usar blocos {} de locais aninhados na configuração do Nginx para dizer a ele para alimentar os arquivos .php em um diretório com alias para o fastcgi enquanto serve conteúdo estático normalmente?

Configuração semelhante ao que me falha:

server {
  listen 80;

  location / {
    index  index.html;
  }

  location /foosite/ {
    alias  /var/aliases/foo;
    location ~ \.php$ {
      include fastcgi_params;
      fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
  }
}

Solicitações de /foosite/static.jpg são exibidas corretamente, mas nginx aparece para alterar o caminho para qualquer arquivo .php ao tentar despachá-las para o fastcgi.

    
por allaryin 29.05.2009 / 21:30

3 respostas

6

A solução fornecida aqui não é uma solução. E não está mais correto. Usando o Lucid (10.4) eu pude usar esta solução. O problema com a solução da womble é que ela não define o parâmetro DOCUMENT_ROOT corretamente; em vez disso, inclui o nome do script no document_root.

Isso parece funcionar bem.

location /foosite {
    alias /home/foosite/www/;
    index index.php index.html index.htm;

    location ~ /foosite/(.*\.php)$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$1;
        include /etc/nginx/fastcgi_params;            
    }                                                 
}

Usando nginx/0.7.65

    
por 19.03.2012 / 04:55
1

O "garbling" de que você fala é, até onde eu sei, um bug no nginx relacionado a blocos de localização aninhados (ou talvez aliases em blocos de localização que fazem correspondência baseada em regex sem uma captura ... não tenho certeza). O que eu consegui fazer, no entanto, foi bastante simples.
Primeiro, você pode colocar todos os seus parâmetros fastcgi, incluindo a fastcgi_pass line e fastcgi_param SCRIPT_FILENAME $request_filename em um arquivo separado para inclusão nas partes relevantes do site. Eu coloquei o meu em /etc/nginx/fragments/php .

Então, para /foosite , você precisa de dois blocos de localização, assim:

location /foosite {
    alias /var/aliases/foo;
}

location /foosite(.*\.php)$ {
    alias /var/aliases/foo$1;
    include /etc/nginx/fragments/php;
}

Uma coisa a ser cautelosa daqui - ao contrário dos blocos de localização "regulares", parece que a correspondência baseada em regex é executada na ordem especificada no arquivo de configuração (não é a correspondência mais longa primeiro, como parece ser o caso de blocos de localização não-regex). Então, se você está fazendo uma localização PHP específica do site, assim como um manipulador genérico do PHP "all-site" ( location ~ \.php$ ), então você precisará colocar o manipulador genérico "all-site" último no bloco do servidor, ou todo o inferno vai se soltar.

Sim, isso é péssimo, e se eu aumentar a motivação eu posso tentar descobrir exatamente o que está errado com o caso aninhado (o analisador de configuração não funciona nele, então eu suspeito que ele deveria funcionar, mas ninguém realmente usa, então é buggy).

    
por 02.01.2010 / 04:40
0

AFAIK, você não pode usar blocos aninhados.

Tente algo como o seguinte em seu lugar.

location / {
  root /var/www;
  access_log off;

  index index.php index.html;
  expires 1d;

  try_files $uri $uri/ /index.php?q=$uri;
}

location ~ \.php$ {
  fastcgi_pass   127.0.0.1:9000;
  fastcgi_index  index.php;
  fastcgi_buffer_size 128k;
  fastcgi_buffers 4 256k;
  fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;
  include        /usr/local/nginx/conf/fastcgi_params;
}

Você pode modificar o segundo bloco para algo como

location ~ /foosite/.*php$

(precisa de testes)

    
por 30.05.2009 / 02:18