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 не допомогла!). Чи може хтось пролити світло на те, що може відбуватися?


Чи можете ви додати частину конфігурації 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 використовує проблему, описану Майклом Хемптоном. Рішення полягає в тому, щоб зняти блок навколо кореневих та індексних директив, таким чином:

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переписували.


1

Якщо ви використовуєте псевдоніми у своїх блоках розташування, така поведінка також може виявляти не оброблену помилку 404. Це можна побачити, якщо на сторінці, що відображається в браузері, є простий текст "Файл не знайдено", на відміну від кращого форматованого (по центру) сторінки nginx 404. По суті, це дійсно говорить про те, що сторінку 404 знайти не можна.

Щоб вирішити, додайте додатковий try_files $uri =404рядок у свій блок розташування та перезавантажте конфігурацію nginx. На додаток до того, що Майкл Хемптон сказав про вирішення конкретної вразливості безпеки , це також дозволяє оброблювачу швидких операцій перекрити визначення псевдоніму і знайти сценарій 404 у місці за замовчуванням.


1
sudo vim /etc/php-fpm.conf

про рядок 149, змініть групу користувачів користувача PHP &&

Я зараз тестую його успішно.


Це спосіб правильно! Гей, чоловіче, ти можеш спробувати!
Любов

Змінивши користувача та групу, ви не забудьте перезапустити php-fpm. Якщо ви використовуєте centos6, ви можете використовувати цю команду: sudo service php-fpm restart
Любов

0

Я бачив :

FastCGI відправив у stderr: "Невідомий первинний сценарій" під час зчитування заголовка відповіді з висхідного потоку

на сервері, який я розміщував під високим навантаженням при стрес-тесті. Я підозрюю, що ще потрібно підтвердити, що наявні ручки файлів з ОС були вичерпані. У такому випадку php-fpm не може отримати посилання на файл.

Я усвідомлюю, що це спекулятивно, але це, безумовно, відповідає моєму сценарію і може допомогти комусь іншому.


0

Дякую @homeway, Ваша відповідь надихає мене. Велике спасибі!

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

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

Оскільки користувач PHP-FPM за замовчуванням користувач: група є apache: apache, але ваш код dir є деякийBody: someBody. Отже, ви повинні змінити права користувача!

Я пишу щоденник, щоб вирішити це питання. Ви можете бачити цей блог:

[Nginx FastCGI надіслано в stderr: "Невідомий первинний скрипт"] [1] `[1]: http://geekhades.blogspot.com/2017/06/nginx-fastcgi-sent-in-stderr-primary.html

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.