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

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

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

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

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

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
}

Responder1

Eu acho que você deveria mudar a raiz do local. De acordo com a documentação do Nginx, a diretiva root também possui o contexto "local":

sintaxe: caminho raiz;

contexto: http, servidor, local, se estiver no local

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
}

Pelo que entendi, a diretiva alias remapeia uma URL para outra URL e o processamento continua, ela não define um diretório de onde originar os arquivos. Não tenho certeza se você ainda precisa reescrever o local do PHP.

Responder2

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 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 não corresponder, tente combiná-lo como um diretório url/, e se não existirem arquivos e diretórios, então tentamos combiná-lo como /app1/index.php?someargs, e se não existir, combine é como/app1/index.php?$query_string

Em primeiro lugar,alias e try_filesnão funcionam juntos, então você pode usar root. Altere o bloco de localização /app1 para o seguinte para ver se isso resolve o seu 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 é igual a $args , a única diferença é que é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.

informação relacionada