Nginx + php5-fpm = "Файл не найден"
Я врезался в стену, пока настраивал сайт с помощью nginx / fpm. На странице отображается "Файл не найден", и это появляется в nginx error.log:
FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream
Я новичок в nginx и fpm, и это сообщение об ошибке ничего не значит для меня (даже машина Google не помогла!). Может ли кто-нибудь пролить свет на то, что может происходить?
7 ответов
Вы должны иметь 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.
Это примечание для пассажирских установок.
Я только что установил 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.
Просто у меня была эта проблема в новой версии 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
был перезаписан.
sudo vim /etc/php-fpm.conf
о строке 149, изменить пользователя php && группу пользователей
Я проверяю это успешно сейчас.
Если вы используете псевдонимы в своих блоках местоположения, необработанная ошибка 404 также может демонстрировать это поведение. Вы можете увидеть это, если страница, отображаемая в браузере, представляет собой простой текст "Файл не найден", в отличие от более форматированной (центрированной) страницы nginx 404. По сути, это действительно говорит, что страница 404 не может быть найдена.
Чтобы решить, добавьте дополнительный try_files $uri =404
линии в вашем блоке местоположения и перезагрузите конфигурацию nginx. В дополнение к тому, что сказал Michael Hampton о решении конкретной уязвимости безопасности, это также позволяет обработчику fastcgi переопределить определение псевдонима и найти скрипт 404 в расположении по умолчанию.
Я видел:
FastCGI отправил в stderr: "Основной сценарий неизвестен" при чтении заголовка ответа из апстрима
на сервере я поместил под высокой нагрузкой при стресс-тестировании. Мое подозрение, которое еще предстоит подтвердить, заключается в том, что доступные файловые дескрипторы из ОС были исчерпаны. В этом случае php-fpm не может получить ссылку на файл.
Я понимаю, что это умозрительно, но, безусловно, соответствует моему сценарию и может также помочь кому-то еще.
Спасибо @homeway, Ваш ответ вдохновляет меня. Большое спасибо!
Я встречал тот же вопрос, но другой метод не помог мне решить вопрос!
Я разрешаю это, я нахожу ключ в том, что: Linux User Right приводит к вопросу: 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