Задать вопрос

Почему php-fpm не находит файл?

Почему PHP-FPM не может найти файл?
В логах Nginx ошибка
FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream

В конфиге Nginx:
location / {
 try_files $uri $uri/ /index.php;
 }

location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|swf|js|html|txt)$ {
root /home/u8/web/site;
}

location ~ \.php$ {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;
    if (!-f $document_root$fastcgi_script_name) {
        return 404;
    }
    fastcgi_param HTTP_PROXY "";
    fastcgi_pass vh2_fphp7.0:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
  • Вопрос задан
  • 3177 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 1
Ошибка "FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream" говорит о том, что Nginx не может найти указанный в файле конфигурации скрипт, речь про эту строку:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;


Рекомендация тут простая - проверьте все пути и убедитесь, что все нужные файлы существуют и лежат на своих местах.

Конкретно в Вашем случае я не вижу определения директивы root за пределами location / или в нем.

Если вы не можете разобраться, в каком каталоге Nginx ищет нужный скрипт, то на узле vh2_fphp7.0 запускаете:

tcpdump port 9000 -A | strings

Вывод покажет всю нужную информацию, в том числе путь к скрипту.

Так же можно включить логирование:
http {
   ...
   log_format scripts '$document_root$fastcgi_script_name > $request';
   server {
   ...
   access_log /var/log/nginx/mysite-scripts.log scripts;
   ...
   }
}


Так же возможно вы неправильно написали регулярку в директиве fastcgi_split_path_info, см. оф. документацию.

Так же проверьте значение cgi.fix_pathinfo = 1 (в некоторых мануалах советуют cgi.fix_pathinfo = 0 что может привести к не правильной обработке переменной PHP_SELF не равной DOCUMENT_URI).

Кстате строки

if (!-f $document_root$fastcgi_script_name) {
        return 404;
    }


по моему абсолютно излишни, уберите их или используйте try_files.
Я конечно понимаю, что сами разработчики Nginx в этой статье написали так..., но....

location ~ \.php$ {
        try_files       $uri = 404;
        fastcgi_pass    127.0.0.1:9001;
        include         /etc/nginx/fastcgi_params;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы