Come appare il messaggio
FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 198.51.100.7, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://unix:/run/php/php8.3-fpm.sock:"Cause frequenti
SCRIPT_FILENAMEè composto male, ad es. senza$document_root.rootè definito solo inlocation /e non vale perlocation ~ \.php$.- PHP-FPM gira in un container o in chroot e vede un percorso diverso da nginx.
- L'utente di PHP-FPM non può leggere il file o una directory superiore.
- Il file PHP richiesto non esiste davvero e manca
try_files.
Verifica
- Mostra le richieste coinvolte nel log
grep 'Primary script unknown' /var/log/nginx/error.log | tail -n 5 - Mostra root, fastcgi_pass e SCRIPT_FILENAME nella config attiva
nginx -T 2>/dev/null | grep -nE '^\s*(root|fastcgi_pass|fastcgi_param\s+SCRIPT_FILENAME|try_files) ' - Mostra utente e socket del pool PHP-FPM
grep -E '^(user|group|listen|chroot)' /etc/php/*/fpm/pool.d/www.conf - Verifica che l'utente di PHP-FPM possa leggere il file
sudo -u www-data test -r /var/www/site/index.php && echo ok
Soluzione
- Imposta
roota livello di server, non solo in una location. - Nel blocco PHP usa
include fastcgi_params;efastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;. - Aggiungi
try_files $fastcgi_script_name =404;così gli script inesistenti finiscono in un 404 pulito. - Con Docker monta lo stesso percorso nei container nginx e PHP.
- Correggi i permessi per l'utente del pool ed esegui
nginx -t && systemctl reload nginx.
Domande frequenti
Perché vedo “File not found.” invece di una pagina 404 di nginx?
Il messaggio arriva da PHP-FPM, non da nginx. nginx ha passato la richiesta senza verificare prima che il file esistesse.
È un problema di sicurezza?
Di per sé no. Ma try_files … =404 prima di fastcgi_pass impedisce anche a PHP-FPM di eseguire percorsi manipolati come /upload/immagine.jpg/x.php.