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;