Nginx: FastCGI sent in stderr: Primary script unknown — Решение
При попытке открыть любую PHP-страницу веб-сервер возвращает пользователю белый экран с лаконичной надписью File not found. или код 404 Not Found. В журнале ошибок Nginx (error.log) фиксируется фатальный сбой FastCGI:
FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: ..., server: example.com, request: "GET /index.php HTTP/1.1".
| Компонент | Переданное значение | Причина ошибки |
|---|---|---|
SCRIPT_FILENAME | /var/www/html/index.php | PHP-FPM не может найти указанный файл по данному пути |
Директива root | Задана внутри другого location | Переменная $document_root оказалась пустой в php-блоке |
| Изоляция контейнеров | Docker PHP-FPM vs Nginx | Несовпадение путей монтирования директорий внутри контейнеров |
- Статические файлы (картинки, CSS) открываются сервером без ошибок.
- Любой вызов
.phpфайлов завершается ответом «File not found.».
- Проверьте блок обработки PHP в конфигурации вашего виртуального хоста Nginx:
server { listen 80; server_name example.com; # Директива root ОБЯЗАТЕЛЬНО должна быть объявлена на уровне блока server: root /var/www/example.com/public; index index.php index.html; location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { # Проверяем физическое существование скрипта перед отправкой в сокет: try_files $fastcgi_script_name =404; include fastcgi_params; fastcgi_pass unix:/run/php/php8.2-fpm.sock; # Передаем абсолютный путь к файлу скрипта: fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } - Убедитесь, что в файле
/etc/nginx/fastcgi_paramsпараметрSCRIPT_FILENAMEне перезаписывается неверным значением. - Проверьте физическое существование файла на диске и права пользователя
www-data(илиphp-fpm):ls -la /var/www/example.com/public/index.php sudo chmod -R 755 /var/www/example.com/public - Для Docker/Docker Compose: Убедитесь, что каталог с сайтом смонтирован в абсолютно одинаковый путь как в контейнере Nginx, так и в контейнере PHP-FPM (например,
/var/www/html:/var/www/html). - Проверьте конфигурацию и примените изменения:
sudo nginx -t && sudo systemctl reload nginx.
/var/www/html/index.php). Если в контейнере PHP-FPM файлы примонтированы в /app/index.php, демон PHP-FPM не сможет открыть переданный путь и вернет ошибку Primary script unknown.Частые вопросы (FAQ)
Что именно означает сообщение Primary script unknown?
Это сообщение генерирует непосредственно демон PHP-FPM. Оно означает, что переданный через FastCGI параметр SCRIPT_FILENAME указывает на несуществующий в файловой системе PHP-FPM файл, либо у процесса PHP-FPM нет прав на чтение этого файла.
Почему помогает директива try_files $fastcgi_script_name =404;?
Она заставляет Nginx предварительно проверить физическое наличие .php файла на диске силами веб-сервера. Если файл не существует, Nginx сразу вернет чистый HTTP 404, не нагружая сокет PHP-FPM заведомо битым запросом.
В чем разница между fastcgi_params и fastcgi.conf в Nginx?
Файл fastcgi.conf содержит строку 'fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;', тогда как стандартный fastcgi_params часто не включает ее по умолчанию.
Может ли директива open_basedir в php.ini вызывать эту ошибку?
Да, если запрошенный файл находится вне путей, разрешенных директивой open_basedir, PHP-FPM заблокирует доступ и вернет Primary script unknown.