Nginx + php5-fpm = «Файл не найден»

14

Я врезался в стену, пока настраивал сайт с помощью nginx / fpm. На странице отображается «Файл не найден», и это появляется в nginx error.log:

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

Я новичок в nginx и fpm, и это сообщение об ошибке ничего не значит для меня (даже машина Google не помогла!). Может ли кто-нибудь пролить свет на то, что может происходить?

Mathew
источник
Не могли бы вы добавить часть своей конфигурации nginx, в которой вы определили обработку PHP?
Кристофер Перрен
Для меня помогла следующая статья: nginxlibrary.com/resolving-no-input-file-specified-error . Обычно эта ошибка возникает, если есть проблема с SCRIPT_FILENAME.
white_gecko

Ответы:

18

У вас должен быть locationраздел для обработки запросов PHP, настроенный так:

    location ~ \.php$ {
            try_files $uri =404;
            fastcgi_pass    127.0.0.1:9000;
            fastcgi_index   index.php;
            fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include         fastcgi_params;
    }

(Дополнительное try_filesисправляет уязвимость безопасности, которая могла позволить произвольным файлам быть выполненными как PHP.)

Кроме того, вы rootдолжны быть определены в serverразделе файла конфигурации, а не в locationразделе. Это одна из самых распространенных ошибок конфигурации nginx .

Майкл Хэмптон
источник
+1 за эту статью о неправильной конфигурации - действительно стоит прочитать, особенно если вы изучаете Nginx. Хорошо написано, начального уровня, с несколькими отличными советами!
Бен
2

Это примечание для пассажирских установок.

Я только что установил nginx из источника через пассажира, что вызвало проблему с php5-fpm. По умолчанию nginx.conf использует проблему, описанную Майклом Хэмптоном. Решением является удаление блока вокруг директив root и index, поэтому:

location / {
    root html
    index index.html index.htm
}

будет выглядеть так:

root html
index index.html index.htm

Кроме того, блок php неправильно настроен. См. Майкл Хэмптонс ответ для правильного пути к нему.

Дополнительным примечанием может быть то, что если php5-fpm настроен на использование сокетов, укажите параметр fastcgi_pass в блоке php в nginx.conf на настройку сокета в /etc/php5/fpm/pool.d/www.conf.

Кеннет
источник
2

Просто у меня была эта проблема в новой версии nginx. (конфиг взят из старой версии)

То, что я должен был сделать, было поместить include fastcgi_params;вышеупомянутый мой обычай SCRIPT_FILENAMEкак это:

location @web {
        try_files $uri =404;
        include         fastcgi_params;
        fastcgi_pass    127.0.0.1:9000;
        fastcgi_param   SCRIPT_FILENAME  $document_root/index.php;
}

Как SCRIPT_FILENAMEто переписывался.

complistic
источник
1

Если вы используете псевдонимы в своих блоках местоположения, эта ошибка также может проявляться в необработанной ошибке 404. Это можно увидеть, если страница, отображаемая в браузере, представляет собой простой текст «Файл не найден», в отличие от более форматированной (центрированной) страницы nginx 404. По сути, это действительно говорит, что страница 404 не может быть найдена.

Чтобы решить try_files $uri =404эту проблему, добавьте дополнительную строку в свой блок местоположения и перезагрузите конфигурацию nginx. В дополнение к тому, что сказал Майкл Хэмптон о решении конкретной уязвимости безопасности , это также позволяет обработчику fastcgi переопределить определение псевдонима и найти скрипт 404 в расположении по умолчанию.

radiumsoup
источник
1
sudo vim /etc/php-fpm.conf

о строке 149, измените php user && user group

Я проверяю это успешно сейчас.

Homeway
источник
Это правильный путь! Эй, чувак, ты можешь попробовать это!
Любовь
Когда вы меняете пользователя и группу, вы не забываете перезапускать php-fpm. Если вы используете centos6, вы можете использовать эту команду: sudo service php-fpm restart
Love
0

Я видел :

FastCGI отправил в stderr: «Основной сценарий неизвестен» при чтении заголовка ответа из апстрима

на сервере я помещен под высокой нагрузкой при стресс-тестировании. Мое подозрение, которое еще предстоит подтвердить, заключается в том, что доступные файловые дескрипторы из ОС были исчерпаны. В этом случае php-fpm не может получить ссылку на файл.

Я понимаю, что это умозрительно, но, безусловно, соответствует моему сценарию и может также помочь кому-то еще.

Ян Льюис
источник
0

Спасибо @homeway, Ваш ответ вдохновляет меня. Большое спасибо!

Я встречал тот же вопрос, но другой метод не помог мне решить вопрос!

Я разрешаю это, я нахожу ключ в следующем: Право пользователя Linux приводит к вопросу: FastCGI отправил в stderr: «Основной сценарий неизвестен»

Потому что по умолчанию в PHP-FPM user: group это apache: apache, но директория вашего кода - someBody: someBody. Таким образом, вы должны изменить право пользователя!

Я пишу блог, чтобы решить этот вопрос, Вы можете увидеть этот блог:

[Nginx FastCGI отправил в stderr: «Основной сценарий неизвестен»] [1] `[1]: http://geekhades.blogspot.com/2017/06/nginx-fastcgi-sent-in-stderr-primary.html

Любовь
источник