Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
Nginx Error: FastCGI sent in stderr: "Primary script unknown" Linux / DevOps

Nginx: FastCGI sent in stderr: Primary script unknown — Решение

Обновлено: 18.08.2026  ·  Официальная база знаний

При попытке открыть любую 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.phpPHP-FPM не может найти указанный файл по данному пути
Директива rootЗадана внутри другого locationПеременная $document_root оказалась пустой в php-блоке
Изоляция контейнеровDocker PHP-FPM vs NginxНесовпадение путей монтирования директорий внутри контейнеров
  • Статические файлы (картинки, CSS) открываются сервером без ошибок.
  • Любой вызов .php файлов завершается ответом «File not found.».
  1. Проверьте блок обработки 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;
        }
    }
  2. Убедитесь, что в файле /etc/nginx/fastcgi_params параметр SCRIPT_FILENAME не перезаписывается неверным значением.
  3. Проверьте физическое существование файла на диске и права пользователя www-data (или php-fpm):
    ls -la /var/www/example.com/public/index.php
    sudo chmod -R 755 /var/www/example.com/public
  4. Для Docker/Docker Compose: Убедитесь, что каталог с сайтом смонтирован в абсолютно одинаковый путь как в контейнере Nginx, так и в контейнере PHP-FPM (например, /var/www/html:/var/www/html).
  5. Проверьте конфигурацию и примените изменения: sudo nginx -t && sudo systemctl reload nginx.
Docker Trap: Nginx передает в PHP-FPM строку пути (например, /var/www/html/index.php). Если в контейнере PHP-FPM файлы примонтированы в /app/index.php, демон PHP-FPM не сможет открыть переданный путь и вернет ошибку Primary script unknown.
Практический опыт инженера: В 90% случаев при переносе сайта на Laravel ошибка связана с отсутствием префикса `/public` в директиве `root /var/www/project/public;`.

Частые вопросы (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.