¿Cómo configurar nginx y fastcgi para ejecutar Laravel en una subcarpeta?

¿Cómo configurar nginx y fastcgi para ejecutar Laravel en una subcarpeta?

Estoy configurando varias aplicaciones de Laravel en subcarpetas de un solo dominio (aplicaciones de redes sociales, necesito https, certificado único).

No puedo entender cómo escribir la configuración de nginx para asignar solicitudes HTTP /app1/a una instalación de Laravel en/var/www/other_folder/public/

Aquí está la última versión de las pruebas de configuración. Se omitió el registro de depuración. La ubicación raíz de Laravel /app1/ funciona, pero el mapeo de rutas ( /app1/api/method/) no. Por favor ayuda, cómo depurar cómo nginx procesa la solicitud paso a paso (el registro de depuración no es tan explicativo), o dame una pista sobre cómo asignar subcarpetas de /app1/...Laravel index.php.

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
}

Respuesta1

Creo que deberías cambiar la raíz de la ubicación. Según la documentación de Nginx, la directiva raíz también tiene el contexto "ubicación":

sintaxis: ruta raíz;

contexto: http, servidor, ubicación, si está en la ubicación

Entonces deberías poder hacer algo como lo siguiente:

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
}

Hasta donde tengo entendido, la directiva de alias reasigna una URL a otra URL y el procesamiento continúa, no define un directorio desde donde obtener los archivos. No estoy seguro de si todavía necesita reescribir la ubicación de PHP.

Respuesta2

Este código no está probado. Pero estás diciendo que funciona con /app1/ pero no con /app1/api/method/ . Supongo que tu problema radica en esta 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;
}

Entonces, esto básicamente indica que intentemos url, y si no coincide, intentemos hacerlo coincidir como un directorio url/, y si no existe ningún archivo ni directorio, entonces intentamos hacerlo coincidir como /app1/index.php?someargs, y si no existe, lo hacemos coincidir. como/app1/index.php?$query_string

En primer lugar,alias y try_filesno funcionan juntos, por lo que puedes usar root en su lugar. Cambie el bloque de ubicación /app1 al siguiente para ver si soluciona su problema.

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

En segundo lugar, $query_string es lo mismo que $args, la única diferencia es que essolo lectura.

Como dije, esto no está probado, pero sería bueno si funcionara. Y cuando no es así, todavía tengo otra idea.

información relacionada