nginx и PHP: File not found и Primary script unknown — что делать
nginx передал запрос PHP-FPM, но PHP-FPM не нашёл файл по пути, который ему прислали. Путь складывается из root и адреса страницы. Виноваты настройки nginx или права на папки сайта.
Содержание 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 Gateway | PHP-FPM не отвечает | разбор |
Источники
- Исходный код PHP 8.3.6: fpm_main.c — Primary script unknown и ответ File not found, Unable to open primary script, ответ Access denied.
- Исходный код PHP 8.3.6: fpm_php.c — проверка security.limit_extensions: файлы с другими расширениями PHP-FPM не выполняет.
- Исходный код PHP 8.3.6: zlog.c — запись Primary script unknown уровня debug уходит nginx, а в журнал PHP-FPM при уровне notice по умолчанию не пишется.
- Файл snippets/fastcgi-php.conf в пакете nginx для Ubuntu 24.04 — проверка try_files и подключение fastcgi.conf.
- Файл fastcgi.conf в пакете nginx для Ubuntu 24.04 — в нём есть строка SCRIPT_FILENAME.
- Файл fastcgi_params в пакете nginx для Ubuntu 24.04 — те же строки, но без SCRIPT_FILENAME.
- nginx: модуль ngx_http_fastcgi_module — для PHP параметр SCRIPT_FILENAME задаёт путь к файлу скрипта.
- nginx: директива root — по умолчанию root html; задаётся в блоке server или location.
- Справка namei для Ubuntu 24.04 — ключ -l показывает права, владельца и группу каждой папки на пути к файлу.
Сверено 14 октября 2026 года.
Что почитать дальше
- Ошибки PHPкак читать сообщение и где журнал.
- Как установить PHP на Ubuntuкак подключить PHP к nginx.
- Права на файлы сайтакакие права и владельца поставить.