Servindo PHP de um alias Nginx

3

Estou trabalhando em uma migração de vários sites do Apache para o Nginx e encontrei um obstáculo em um que tenha um diretório virtual (alias). O alias funciona bem e o arquivo adequado é servido, mas o PHP não está em proxy corretamente.

server {
  listen      443 default_server ssl;
  server_name dev.myproject.mydomain.net;
  root        /opt/dev/project-root;
  index       index.php;

  ssl_certificate      /etc/ssl/certs/server.crt;
  ssl_certificate_key  /etc/ssl/certs/server.pem;

  access_log /var/log/nginx/vh.project.access.log;
  error_log  /var/log/nginx/vh.project.error.log;

  location ~ ^/alias_name/(.*) {
    alias /opt/dev/project-root/www/$1;

    location ~ ^/alias_name/(.+\.php)$ {
      alias /opt/dev/project-root/www/$1;
      include /etc/nginx/conf/php;
    }
  }

  location ~ \.php$ {
    include /etc/nginx/conf/php;
  }
}

Ainda não tentei isso, mas suspeito que, se eu copiei o conteúdo do bloco \.php$ location para o bloco de alias, as coisas funcionariam bem, mas o engenheiro em mim detesta a replicação. Existe alguma maneira de evitar isso (supondo que funcionaria de todo)? Intuitivamente, parece que ambos os blocos de localização seriam avaliados.

Eu também posso mover o bloco php para um arquivo separado e incluí-lo, tenho certeza.

Qualquer conselho sobre o melhor caminho (leia-se: a maioria dos nginx-y) para lidar com isso seria muito apreciado.

UPDATE

Com base na resposta de Kyle, mudei o proxy PHP para um diretório conf/ separado. O arquivo conf/php tem este código:

location ~ \.php$ {
  fastcgi_split_path_info ^(.+\.php)(/.+)$;
  fastcgi_pass 127.0.0.1:9000;
  fastcgi_index index.php;
  include fastcgi_params;
}

Meu bloco de localização de alias agora é assim:

location ~ ^/alias_name/(.*) {
  alias /opt/dev/path/to/aliased/$1;
  include /etc/nginx/conf/php;
}

Se eu derrubar um arquivo HTML estático nesse alias, ele renderiza bem. Um arquivo PHP retorna um 404.

UPDATE

Com a ajuda do @ quanta nos comentários, consegui fazer o PHP funcionar corretamente e atualizei o bloco de localização do alias com a configuração. Infelizmente, o conteúdo não estático não está sendo renderizado se o URL incluir o alias. Hoje não é meu dia.

    
por Rob Wilkerson 17.08.2012 / 14:08

2 respostas

2

Ok, então eu posso ter encontrado minha própria resposta por tentativa e erro de força bruta assim que eu incorporar as informações do @quanta (veja os comentários acima). Esse bloco do servidor host virtual parece servir corretamente ao conteúdo estático do PHP e :

server {
  listen      443 default_server ssl;
  server_name dev.myproject.mydomain.net;
  root        /opt/dev/project-root;
  index       index.php;

  ssl_certificate      /etc/ssl/certs/server.crt;
  ssl_certificate_key  /etc/ssl/certs/server.pem;

  access_log /var/log/nginx/myproject.dev.access.log;
  error_log  /var/log/nginx/myproject.dev.error.log;

  location ~ ^/alias_name/(.+\.php)$ {
    alias /opt/dev/project-root/www/$1;
    include /etc/nginx/conf/php;
  }
  location ~ ^/alias_name/(.*) {
    alias /opt/dev/project-root/www/$1;
  }

  location ~ \.php$ {
    include /etc/nginx/conf/php;
  }
}

Eu não sei se vou me deparar com problemas e não posso dizer que entendi completamente a diferença, mas simplesmente remover os blocos location aninhados parece ter feito o truque.

    
por 17.08.2012 / 21:58
0

Você poderia colocar o bloco php em uma inclusão externa e, em seguida, fazer isso, eu não estou 100% no comando include, mas isso deve funcionar.

server {
  listen      443 default_server ssl;
  server_name dev.myproject.mydomain.net;
  root        /opt/dev/project-root;
  index       index.php;

  ssl_certificate      /etc/ssl/certs/server.crt;
  ssl_certificate_key  /etc/ssl/certs/server.pem;

  access_log /var/log/nginx/vh.project.access.log;
  error_log  /var/log/nginx/vh.project.error.log;

  location ~ ^/alias_name/(.*) {
    alias /opt/dev/path/to/aliased/$1;
    include php.inc
  }

  # include defualt location
include php.inc
}

php.inc

  # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  #
  location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    include fastcgi_params;
  }
    
por 17.08.2012 / 14:24

Tags