Como configurar o nginx e o fastcgi para executar o Laravel em uma subpasta?

2

Estou configurando vários aplicativos do Laravel em subpastas de um único domínio (aplicativos de redes sociais, necessidade de https, certificado único).

Não é possível descobrir como escrever nginx config para mapear solicitações HTTP para /app1/ para uma instalação do Laravel em /var/www/other_folder/public/

Aqui está a última iteração dos testes de configuração. Log de depuração omitido. Laravel raiz localização / app1 / funciona, mas o mapeamento de rotas ( /app1/api/method/ ) não. Por favor, ajude como depurar como o nginx processa o pedido passo a passo (o log de depuração não é explicativo), ou me dê uma dica de como mapear as subpastas de /app1/... para o index.php do Laravel.

server {
    listen      80;
    server_name  apps.mydomain.com;
    root    /var/www/apps.mydomain.com/docs;

    location /  {
        index   index.html index.php;
    }

    location /app1    {
        alias   /var/www/other_folder/public;
        index   index.php   index.html;
        try_files   $uri  $uri/ /app1/index.php$is_args$args /app1/index.php?$query_string;
    }

    location ~ /app1/.+\.php$ {
        rewrite ^/app1/(.*)$  /$1  break;
        include /etc/nginx/fastcgi.conf;
        fastcgi_param    SCRIPT_FILENAME    /var/www/other_folder/public$fastcgi_script_name;

        fastcgi_index  index.php;
        fastcgi_pass php;

        #   Database access parameters
        fastcgi_param   DB_HOST "localhost";
        fastcgi_param   DB_USER "apps";
        fastcgi_param   DB_PASS "xxxxxxxx";
        fastcgi_param   DB_NAME "app1";
    }

    # Other locations skipped
    include /etc/nginx/global/php.conf; # other php scripts
}
    
por Sergiks 12.01.2014 / 22:02

2 respostas

4

Acho que você deve alterar a raiz do local. De acordo com a documentação do Nginx, a diretiva raiz também possui o contexto "location":

syntax: root path;

context: http, server, location, if in location

Então você deve ser capaz de fazer algo como o seguinte:

server {
    listen      80;
    server_name  apps.mydomain.com;
    root    /var/www/apps.mydomain.com/docs;

    location /  {
        index   index.html index.php;
    }

    location /app1    {
        root   /var/www/other_folder/public;
        rewrite ^/app1/(.*)$  /$1  break;
        index   index.php   index.html;
        try_files   $uri  $uri/ /index.php$is_args$args /index.php?$query_string;
    }

    location ~ /app1/.+\.php$ {
        root   /var/www/other_folder/public;
        rewrite ^/app1/(.*)$  /$1  break;
        include /etc/nginx/fastcgi.conf;
        fastcgi_param    SCRIPT_FILENAME    $document_root$fastcgi_script_name;

        fastcgi_index  index.php;
        fastcgi_pass php;

        #   Database access parameters
        fastcgi_param   DB_HOST "localhost";
        fastcgi_param   DB_USER "apps";
        fastcgi_param   DB_PASS "xxxxxxxx";
        fastcgi_param   DB_NAME "app1";
    }

    # Other locations skipped
    include /etc/nginx/global/php.conf; # other php scripts
}

Tanto quanto eu entendo, a diretiva de alias remapeia um URL para outro URL e o processamento continua, ele não define um diretório de onde os arquivos de origem. Não tenho certeza se você ainda precisa reescrever no local do PHP.

    
por 17.01.2014 / 11:07
1

Este código não foi testado. Mas você está dizendo que funciona com / app1 / mas não com / app1 / api / method /. Eu acho que o seu problema está nesta parte:

location /app1    {
    alias   /var/www/other_folder/public;
    index   index.php   index.html;
    try_files   $uri  $uri/ /app1/index.php$is_args$args /app1/index.php?$query_string;
}

então isso basicamente diz para tentar o url , e se ele não corresponder, tente combiná-lo como um diretório url/ , e se nenhum arquivo e diretório existir, tentaremos igualá-lo como /app1/index.php?someargs , e se não existir, combine-o como /app1/index.php?$query_string

Primeiro de tudo, o alias e o try_files não funcionam juntos, então você pode usar o root. Altere o bloco de localização / app1 para o seguinte para ver se ele resolve o problema.

location /app1    {
    root   /var/www/other_folder/public;
    index   index.php   index.html;
    try_files $uri $uri/ /index.php$is_args$args;
}

Segundo, $ query_string é o mesmo que $ args, a única diferença é que ele é somente leitura.

Como eu disse, isso não foi testado, mas seria bom se funcionasse. E quando isso não acontece, ainda tenho outra ideia.

    
por 17.01.2014 / 01:11

Tags