nginx vários (por enquanto dois) projetos php via php-fpm em subdiretórios usando alias

1

Pelo amor do nginx, não consigo me acostumar com essa questão.

Desejado: Eu quero dois projetos php simples (wordpress no longo prazo) em dois sub-locais em um bloco de servidor. Nota: Esses projetos residem em dois diretórios diferentes no servidor implantado com o capistrano.

Problema: eu acabo com um download de fluxo de octeto direto 404, 403 ou direto do index.php. No último eu pareço acertar o index.php correto, mas ele não é passado para o bloco php-fpm. O php-fpm está funcionando e não o problema (testado em outro servidor sem sublocações)

Eu procurei em toda a web e tentei zilhões de configurações de "trabalho", mas não está se unindo.

Plano: Abaixo, você vê um vhost nginx em funcionamento, atingindo os arquivos index.html corretos nos diretórios de alias corretos. Assim estou no meio do caminho.

Com sua ajuda, eu gostaria de adaptar a configuração abaixo, para alterar o index para index.php e fazer o php funcionar em location /staging e /production .

No location /production você vê uma configuração (comentada) como eu tentei fazer o php funcionar.

server {
  listen 82;
  listen [::]:82;

  server_name nginx-web.ch;

  access_log /var/log/nginx/nginx-web_access.log;
  error_log /var/log/nginx/nginx-web_error.log;

  location  /staging {
    alias /var/www/nginx-web1/current;
    index index.html
    add_header X-debug-message "Location web1";
  }

  location /production {
    alias /var/www/nginx-web/current;
    index index.html
    add_header X-debug-message "Location web";

    #try_files $uri $uri/ /production/index.php;

    #location ~ \.php$ {
      # add_header X-debug-message "Location ~ php";
      # try_files $uri =404;
      # fastcgi_split_path_info ^(.+\.php)(/.+)$;
      # fastcgi_pass unix:/var/run/php5-fpm.sock;
      # fastcgi_index index.php;
      # include fastcgi_params;
      # fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    #}
  }
}

Aqui está um bloco de servidores que ele tentou adaptar para sublocações, sem sucesso: (

server {
  listen 80;
  listen [::]:80;

  server_name testdev;

  access_log /var/log/nginx/wp_access.log;
  error_log  /var/log/nginx/wp_error.log;

  root /var/www;
  index index.php;

  location / {
    try_files $uri $uri/ /index.php?$args; 
  }

  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
  }
}

UPDATE com CONFIGURAÇÃO DE TRABALHO (tem < 3 serverfault / stackoverflow):

Aqui está a configuração final de trabalho, muito obrigado a @RichardSmith

server {
    listen 82;
    listen [::]:82;

    server_name nginx-web.ch;

    access_log /var/log/nginx/nginx-web_access.log;
    error_log /var/log/nginx/nginx-web_error.log;

    index index.php;

    location ^~ /staging/ {
      alias /var/www/nginx-web1/current/;

      if (!-e $request_filename) { rewrite ^ /staging/index.php last; }

      location ~ \.php$ {
       if (!-f $request_filename) { return 404; }

       include fastcgi_params;
          fastcgi_param  SCRIPT_FILENAME $request_filename;
          fastcgi_pass unix:/var/run/php5-fpm.sock;
       }
    }

    location /production {
      alias /var/www/nginx-web/current;

      if (!-e $request_filename) { rewrite ^ /production/index.php last; }

      location ~ \.php$ {
        if (!-f $request_filename) { return 404; }

        include fastcgi_params;
          fastcgi_param  SCRIPT_FILENAME $request_filename;
          fastcgi_pass unix:/var/run/php5-fpm.sock;
        }
    }
}
    
por mahatmanich 24.11.2017 / 10:59

1 resposta

1

Esse padrão funciona:

location ^~ /prefix/ {
    alias /path/to/root/;
    if (!-e $request_filename) { rewrite ^ /prefix/index.php last; }

    location ~ \.php$ {
        if (!-f $request_filename) { return 404; }

        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME $request_filename;
        fastcgi_pass   ...;
    }
}

Use o prefixo ^~ para evitar que outras expressões regulares location bloqueiem tendo precedência. Consulte este documento .

O valor de location e alias termina com / ou nenhum deles termina com / . Consulte este documento .

Evite usar alias e try_files juntos devido a este problema e veja esta cautela sobre o uso de if .

Use $request_filename como o valor computado de SCRIPT_FILENAME (como funciona com alias e root ).

Sempre defina fastcgi_param após incluindo o arquivo fastcgi_params , para evitar que o último substitua silenciosamente o valor local.

    
por 24.11.2017 / 11:48