Wie richte ich Nginx und Fastcgi ein, um Laravel in einem Unterordner auszuführen?

Wie richte ich Nginx und Fastcgi ein, um Laravel in einem Unterordner auszuführen?

Ich richte mehrere Laravel-Apps in Unterordnern einer einzelnen Domäne ein (Social-Network-Apps, benötigen https, einzelnes Zertifikat).

Ich kann nicht herausfinden, wie man eine Nginx-Konfiguration schreibt, um HTTP-Anfragen /app1/einer Laravel-Installation unter zuzuordnen/var/www/other_folder/public/

Hier ist die neueste Iteration der Konfigurationstests. Debug-Protokollierung ausgelassen. Der Laravel-Stammspeicherort /app1/ funktioniert, die Zuordnung von Routen ( /app1/api/method/) jedoch nicht. Bitte helfen Sie mir, entweder zu debuggen, wie nginx die Anfrage Schritt für Schritt verarbeitet (das Debug-Protokoll ist nicht so erklärend), oder geben Sie mir einen Hinweis, wie ich Unterordner von /app1/...zu index.phpLaravel zuordnen kann.

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
}

Antwort1

Ich denke, Sie sollten die Wurzel des Standorts ändern. Laut Nginx-Dokumentation hat die Root-Direktive auch den Kontext „Standort“:

Syntax: Stammpfad;

Kontext: http, Server, Standort, wenn am Standort

Sie sollten also in der Lage sein, etwa Folgendes zu tun:

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
}

Soweit ich es verstehe, ordnet die Alias-Direktive eine URL einer anderen URL zu und die Verarbeitung wird fortgesetzt. Sie definiert kein Verzeichnis, aus dem die Dateien bezogen werden. Ich bin mir nicht sicher, ob Sie die Umschreibung am PHP-Speicherort noch benötigen.

Antwort2

Dieser Code ist ungetestet. Aber Sie sagen, er funktioniert mit /app1/, aber nicht mit /app1/api/method/ . Ich vermute, Ihr Problem liegt in diesem Teil:

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;
}

das sagt also im Grunde, dass wir versuchen sollen, das zu versuchen url, und wenn es nicht übereinstimmt, versuchen wir, es als Verzeichnis abzugleichen url/, und wenn keine Dateien und Verzeichnisse vorhanden sind, versuchen wir, es als abzugleichen /app1/index.php?someargs, und wenn es nicht existiert, ordnen wir es als zu/app1/index.php?$query_string

Erstens,Alias ​​und Try_Filesfunktionieren nicht zusammen, Sie können stattdessen root verwenden. Ändern Sie den /app1-Standortblock wie folgt, um zu sehen, ob das Ihr Problem behebt.

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

Zweitens ist $query_string dasselbe wie $args , der einzige Unterschied ist, dass esschreibgeschützt.

Wie gesagt, das ist ungetestet, aber es wäre schön, wenn es funktioniert. Und wenn nicht, habe ich noch eine andere Idee.

verwandte Informationen