Ошибки

nginx и PHP: File not found и Primary script unknown — что делать

nginx передал запрос PHP-FPM, но PHP-FPM не нашёл файл по пути, который ему прислали. Путь складывается из root и адреса страницы. Виноваты настройки nginx или права на папки сайта.

≈ 6 мин чтения3 шага
Содержание 8

Как выглядит ошибка

В браузере — белая страница с одной строкой File not found. Это ответ PHP-FPM. В журнале nginx — запись с такими словами:

FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream

Посмотреть журнал: sudo tail -n 30 /var/log/nginx/error.log. Команды вводятся на сервере: подключитесь к нему по SSH (как подключиться) и набирайте их в том же окне. В журнал самого PHP-FPM эта запись при настройках по умолчанию не попадает — смотрите журнал nginx.

Если страница nginx с крупной надписью 404 Not Found — это другой случай: nginx сам не нашёл файл и до PHP запрос не дошёл. Разбор — Ошибка 404.

Почему так

nginx сам PHP не выполняет: он передаёт запрос PHP-FPM и сообщает путь к файлу в параметре SCRIPT_FILENAME. Путь складывается из папки сайта — строки root — и адреса страницы: для /index.php и root /var/www/example.com это /var/www/example.com/index.php. Если параметра нет или по этому пути PHP-FPM файл не видит, он отвечает File not found.

ПричинаКак узнать
в блоке PHP подключён fastcgi_paramsв блоке location есть строка include fastcgi_params
root задан только внутри location /строка root не на уровне server
у PHP-FPM нет доступа к папкам сайтанастройки верные, а ошибка остаётся

1. Проверьте блок PHP в настройках сайта

Откройте файл настроек сайта — вместо example.com подставьте имя своего файла из папки /etc/nginx/sites-available/:

sudo nano /etc/nginx/sites-available/example.com

Найдите блок для PHP: нажмите Ctrl+W, введите \.php и нажмите Enter. Для Ubuntu он должен выглядеть так:

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    }

Если вместо include snippets/fastcgi-php.conf; стоит include fastcgi_params; — причина в этом: в файле fastcgi_params нет строки SCRIPT_FILENAME, и PHP-FPM не получает путь к файлу. Замените строку на include snippets/fastcgi-php.conf; — этот файл подключает fastcgi.conf, где путь задан.

Если в блоке есть своя строка fastcgi_param SCRIPT_FILENAME с готовой папкой, например /var/www/html$fastcgi_script_name, — папка в ней должна совпадать с папкой сайта. Проще удалить эту строку: snippets/fastcgi-php.conf задаёт путь сам, от root.

Сохраните файл — Ctrl+O, Enter, затем Ctrl+X — и проверьте настройки: sudo nginx -t. В ответе должны быть слова syntax is ok и test is successful. Тогда примените их: sudo systemctl reload nginx.

2. Проверьте, где задан root

Строка root должна стоять в блоке server, а не внутри location /:

server {
    server_name example.com;
    root /var/www/example.com;
    index index.php index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    }
}

Если root задан только внутри location /, блок для PHP его не видит и берёт папку по умолчанию — html в папке nginx. Перенесите строку root на уровень server, как в примере. Сохраните файл — Ctrl+O, Enter, затем Ctrl+X — и проверьте настройки: sudo nginx -t. В ответе должны быть слова syntax is ok и test is successful. Тогда примените их: sudo systemctl reload nginx.

3. Проверьте доступ к папкам

PHP-FPM работает от своего пользователя — в Ubuntu это www-data. Чтобы найти файл, ему нужно право входа (x) в каждую папку на пути к файлу. Посмотрите права всех папок на пути:

sudo namei -l /var/www/example.com/index.php

Как читать ответ и что исправить — Нет прав на файлы. Если файлы сайта лежат в домашней папке, например /home/ivan/site, закрытой для других пользователей, перенесите сайт в /var/www/.

Если nginx и PHP-FPM работают в разных контейнерах Docker, папка сайта должна быть доступна в обоих по одному и тому же пути: nginx передаёт путь, а ищет файл PHP-FPM.

Похожие ответы PHP-FPM

В браузереЧто значитЧто делать
Access denied.файл найден, но PHP-FPM не может его прочитать — в журнале PHP-FPM строка Unable to open primary script с Permission deniedдать права на чтение
Access denied.PHP-FPM прислали файл не с расширением .phpпроверить, что в PHP-FPM уходят только адреса .php: блок location ~ \.php$
No input file specified.путь есть, но файл не открылсяпричина — в журнале PHP-FPM: sudo tail -n 30 /var/log/php8.3-fpm.log
502 Bad GatewayPHP-FPM не отвечаетразбор

Источники

Сверено 14 октября 2026 года.

Что почитать дальше