FastCGI: Primäres Skript kann unter NGinx und PHP-FPM nicht geöffnet werden

FastCGI: Primäres Skript kann unter NGinx und PHP-FPM nicht geöffnet werden

Ich bin anscheinend nicht der Einzige mit diesem Problem, aber nachdem ich einige vorgeschlagene Lösungen ausprobiert habe, bin ich an einem Punkt angelangt, an dem ich nicht mehr weiterweiß.

Ich verwende Ubuntu 16.04, NGinx und PHP-FPM.

Die Datei nginx.conf ist die Standarddatei, ich habe lediglich ein informativeres Protokollformat festgelegt.

Die Benutzerrechte scheinen in Ordnung zu sein: NGinx und PHP_FPM laufen unter dem Benutzer www-data. Document-Root-Besitzer ist www-data. FPM-Pool-Besitzer ist www-data. Socket-Datei ist vorhanden und beschreibbar.

Ich habe bereits versucht, die Ordner- und Dateiberechtigungen auf den schwächsten Wert (chmod 777) zu setzen: Kein Ergebnis.

Dies ist meine server.conf. Wie Sie den kommentierten Zeilen entnehmen können, habe ich eine Reihe von Tricks ausprobiert – ohne Wirkung:

server {
    listen         8080;
#    listen         8080 default_server;
 #   listen         [::]:8080 default_server;
    server_name    example.com www.example.com
    root           /var/www/nginx/;
    index          index.php;
        access_log /var/log/nginx/scripts.log scripts;


    gzip             on;
    gzip_comp_level  3;
    gzip_types       text/plain text/css application/javascript image/*;

    location ~ \.php$ {
        if ($uri !~ "^/uploads/") {
            fastcgi_pass unix:/run/php/php-fpm-www.sock;

        }

    include fastcgi.conf;

#    include         snippets/fastcgi-php.conf;
    include         fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param SCRIPT_NAME $fastcgi_script_name;

  }

    # Block access to .htaccess
    location ~ \.htaccess {
        deny all;
    }

}    

Das ist die FPM-Pool-Konfiguration:

[www]
listen = /run/php/php-fpm-$pool.sock
user = www-data
group = www-data
listen.owner = www-data
listen.group = www-data
php_admin_flag[allow_url_fopen] = off
php_admin_flag[allow_url_include] = off
php_admin_value[memory_limit] = 128M
pm = dynamic
pm.max_children = 5
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 3
chdir = /
chroot = /var/www/nginx/
php_flag[display_errors] = on
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on
catch_workers_output = yes

Dies ist die Ausgabe des access.log von nginx:

/var/www/nginx/index.php > GET /index.php HTTP/1.1

Und das ist das eigentliche error.log:

2018/08/29 17:34:27 [error] 24020#24020: *47 FastCGI sent in stderr: "Unable to open primary script: /var/www/nginx/index.php (No such file or directory)" while reading response header from upstream, client: 213.61.37.18, server: example.com, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php-fpm-www.sock:", host: "example.com:8080"

Antwort1

Habe den Fehler nach dem Hinweis von @michael selbst gefunden - danke für die Aufklärung.

Ich verwende chroot, weil das Ziel darin besteht, jede Website in ihrem eigenenUmfeld/ Ordner. Also habe ich die Wurzel dieses bestimmtenUmfeldzum tatsächlichen Speicherort des Dateisystems/var/www/nginx.

Innerhalb der Serverkonfiguration von NGinx übergebe ich den Fastcgi-Parameter SCRIPT_FILENAME mit einem führenden $document_root.

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

In NGinx verweist $document_root auf die Root-Direktive. Das $document_root ist natürlich/var/www/nginx

Aber die PHP-Umfeldhat ein „geändertes Stammverzeichnis“ (/ bedeutet /var/www/nginx). Das bedeutet, dass PHP jetzt im Ordner /var/www/nginx nach index.php sucht. Da der Stammordner aber nur „virtuell“ ist, verweist PHPs /var/www/nginx tatsächlich auf diesen Speicherort im realen Dateisystem: /var/www/nginx/var/www/nginx.

Durch Ändern des Parameters entsprechend wird der Fehler behoben.

fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;

verwandte Informationen