Вопрос: Nginx 1 FastCGI отправлен в stderr: «Неизвестный первичный скрипт»


Мой первый раз с использованием Nginx, но я более чем знаком с Apache и Linux. Я использую существующий проект, и когда я пытаюсь увидеть index.php, я получаю файл 404, который не найден.

Вот запись access.log:

2013/06/19 16:23:23 [error] 2216#0: *1 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.ordercloud.lh"

И вот сайт-доступный файл:

server {
    set $host_path "/home/willem/git/console/www";
    access_log  /www/logs/console-access.log  main;

    server_name  console.ordercloud;
    root   $host_path/htdocs;
    set $yii_bootstrap "index.php";

    charset utf-8;

    location / {
        index  index.html $yii_bootstrap;
        try_files $uri $uri/ /$yii_bootstrap?$args;
    }

    location ~ ^/(protected|framework|themes/\w+/views) {
        deny  all;
    }

    #avoid processing of calls to unexisting static files by yii
    location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
        try_files $uri =404;
    }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php {
        fastcgi_split_path_info  ^(.+\.php)(.*)$;

        #let yii catch the calls to unexising PHP files
        set $fsn /$yii_bootstrap;
        if (-f $document_root$fastcgi_script_name){
            set $fsn $fastcgi_script_name;
        }

        fastcgi_pass   127.0.0.1:9000;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fsn;

        #PATH_INFO and PATH_TRANSLATED can be omitted, but RFC 3875 specifies them for CGI
        fastcgi_param  PATH_INFO        $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED  $document_root$fsn;
    }

    location ~ /\.ht {
        deny  all;
    }
}

Мой / home / willem / git / console принадлежит www-data: www-data (мой веб-пользователь работает php и т. Д.), И я дал ему 777 разрешений из-за разочарования ...

Мое лучшее предположение, что что-то не так с конфигурацией, но я не могу понять это ...

ОБНОВИТЬ Поэтому я перевел его на /var/www/ и использовал гораздо более базовую конфигурацию:

server {
    #listen   80; ## listen for ipv4; this line is default and implied
    #listen   [::]:80 default ipv6only=on; ## listen for ipv6

    root /var/www/;
    index index.html index.htm;

    # Make site accessible from http://localhost/
    server_name console.ordercloud;

    location / {
        root           /var/www/console/frontend/www/;
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /var/www;
            include        fastcgi_params;
    }

    location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
            try_files $uri =404;
        }

    location /doc/ {
        alias /usr/share/doc/;
        autoindex on;
        allow 127.0.0.1;
        deny all;
    }

}

Также, если я позвоню localhost/console/frontend/www/index.php Я получаю 500 PHP, что означает, что он там работает. Это просто не отключение от console.ordercloud ...


52
2018-06-20 08:33


Источник


Другая возможная причина. Если вы используете php-fpm, убедитесь, что пользователь, установленный в /etc/php-fpm.d/www.conf, имеет разрешения для скрипта, который он пытается запустить. Я думаю, что он по умолчанию использует apache. - Dave
Еще одна возможная причина, по которой ваш SElinux включен, проверьте конфигурацию SElinux и отключите его. - CK.Nguyen


Ответы:


Сообщение об ошибке «Неизвестный первичный скрипт» почти всегда связанные с неправильным набором SCRIPT_FILENAME в nginx fastcgi_param (или неправильные разрешения, см. другие ответы).

Вы используете if в конфигурации, которую вы разместили в первую очередь. Хорошо, что теперь хорошо известно, что если зло и часто создает проблемы.

Настройка root директива внутри блока местоположения - это плохая практика, конечно, она работает.

Вы можете попробовать что-то вроде следующего:

server {
    location / {
        location ~* \.php$ {
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_pass 127.0.0.1:9000;
            try_files $uri @yii =404;
        }
    }
    location @yii {
        fastcgi_param SCRIPT_FILENAME $document_root$yii_bootstrap;
    }
}

Обратите внимание, что указанная выше конфигурация не проверена. Вы должны выполнить nginx -t прежде чем применять его для проверки проблем, которые nginx может обнаружить сразу.


77
2018-06-20 16:50



Это решает это для меня; Я не знал, что вам нужно префикс $ document_root, я предположил, что он сделал это автоматически, на основе root. - b01
Где можно узнать больше о плохой практике установки root в пределах местоположения? - Dan Dascalescu
Для тех, кто не понимает точно, как переменная может быть неправильной: добавьте в основной Nginx http раздел: log_format scripts '$document_root$fastcgi_script_name > $request'; (или что бы вы ни кормили SCRIPT_FILENAME), и server: access_log /var/log/nginx/scripts.log scripts, Перезагрузите и взгляните на свой новый журнал сценариев;) - igorsantos07
Да, конечно: nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/... - Fleshgrinder
Что такое yii_bootstrap? - Love


Это не всегда что SCRIPT_FILENAME неправильно.
Он также может быть PHP работает как неправильный пользователь / группа,

Этот пример специфичен для Mac OS X, который по моему опыту является самым трудным для настройки (Debian легко сравнивается) - я только что обновил с PHP 5.6 до 7.0, используя доморощенного и отличные пакеты josegonzalez.

Проблема заключалась в том, что была создана новая копия файлов конфигурации.

Основной файл конфигурации /usr/local/etc/php/7.0/php-fpm.conf, но обратите внимание на Определения пула в конце, где он содержит полный подкаталог.

include=/usr/local/etc/php/7.0/php-fpm.d/*.conf

В php-fpm.d есть www.conf файл. По умолчанию это:

user = _www
group = _www

В OS X вам может потребоваться изменить это:

user = [your username]
group = staff

(вы должны найти, что это соответствует ls -lh вашего документа_рука)

К сожалению, без этого изменения вы все равно увидите это в своем журнале ошибок Nginx даже если он ищет файл в нужном месте,

"Primary script unknown" while reading response header from upstream

Проверьте, что он в настоящее время работает как:

ps aux | grep 'php-fpm'

или более чисто:

ps aux | grep -v root | grep php-fpm | cut -d\  -f1 | sort | uniq

Как проверить правильность имени файла сценария:

(украденный у igorsantos07 в другом ответе)

добавить в http блок основных /usr/local/etc/nginx/nginx.conf:

log_format scripts '$document_root$fastcgi_script_name > $request';

(где первый бит должен быть тем, что вы используете в данный момент, поэтому вы можете видеть, правильно ли оно.)

И чтобы использовать журнал, который вы только что определили, на вашем сайте server блок:

access_log /var/log/nginx/scripts.log scripts;

Если это правильно, запрос example.com/phpinfo.php приведет к созданию чего-то вроде этого:

/path/to/docroot/phpinfo.php > GET /phpinfo.php

Можете ли вы упростить существующую конфигурацию?

Вы используете location ~ \.php { блокировать, что вы скопировали / вставляли откуда-то из Интернета? Большинство пакетов позволяют вам делать это быстрее и чище. например на OS X теперь вам просто нужно:

location ~ \.php {
    fastcgi_pass 127.0.0.1:9000;
    include snippets/fastcgi-php.conf;

    # any site specific settings, e.g. environment variables
}

Такие вещи, как fastcgi_split_path_info, try_files и fastcgi_index (по умолчанию index.php), находятся в /usr/local/etc/nginx/snippets/fastcgi-php.conf,

Это, в свою очередь, включает /usr/local/etc/nginx/fastcgi.conf который является списком fastcgi_param настройки, включая критический SCRIPT_FILENAME.

Никогда не дублируйте root в блоке местоположения PHP.


32
2018-02-06 00:11



очень хорошо! это было для меня! Привет, друг! - rollsappletree
Благодарю. Для меня в контейнерах док-станции fpm / nginx, с которыми я работал, были разрешения на доступ к этим папкам. - Tek
@ Ответ Флешминдера неправильно и ваш прав! В моем случае, действительно, только вопрос об исправлении права собственности в /etc/php/7.0/php-fpm.d/www.conf файл. Приветствую вас, бутон. :) Еще многие люди могут начать рассматривать эту проблему также, поскольку бродячая популярность продолжает расти. - user392778
не мог найти ничего внутри /usr/local/etc/nginx/snippets/fastcgi-php.conf на моем mac .. но я нашел /usr/local/etc/nginx/fastcgi.conf - abbood


Хорошо, так что три вещи, которые я нашел после дня борьбы

  1. По какой-то причине у меня уже что-то работало на порте 9000, поэтому я изменено на 9001
  2. Мой сайт по умолчанию перехватил мой новый, еще раз я не понимаете, почему, так как это не должно, но я просто отсоединил его
  3. Nginx автоматически не выполняет символическую ссылку для сайтов, доступных для сайт с поддержкой.

Надеюсь, это избавит кого-то от неприятностей!


5
2018-06-20 10:00



hello @ we0, я столкнулся с такой же проблемой с моей настройкой. Я также запускаю другое приложение на порт 3001, поэтому мне нужно разместить мое приложение php на порту 3002. Вы можете увидеть мой оригинальный пост здесь: stackoverflow.com/questions/33229867/... а также stackoverflow.com/questions/33409539/... и другой stackoverflow.com/questions/33519989/..., Есть ли у вас какие-либо идеи? - Manish Sapkal
Автоматическое создание символических ссылок на сайтах, доступных для сайтов, было бы нежелательно. Вам решать эти символические ссылки, чтобы вы могли контролировать, какие сайты «включены» и «выключены» на вашем сервере. - Erathiel


Была та же проблема с новым nginx (v1.8). Новые версии рекомендуют использовать snippets/fastcgi-php.conf; вместо fastcgi.conf, Итак, если вы скопируете / вставляете include fastcgi.conf из учебника вы можете оказаться в Primary script unknown ошибка в журнале.


5
2018-06-17 09:24





У меня тоже был этот вопрос, и я решил его, обменяв строки include fastcgi_params а также fastcgi_param SCRIPT_FILENAME ...,

Действительно, nginx устанавливает последнее значение каждого параметра FastCGI, поэтому вы должны поместить свое значение после значения по умолчанию, включенного в fastcgi_params.


2
2017-08-05 19:39





Msgstr "Неизвестный первичный скрипт" вызвано Контекст безопасности SELinux.

клиент получает ответ

Файл не найден.

nginx error.log имеет следующее сообщение об ошибке

* 19 FastCGI отправлен в stderr: «Первичный скрипт неизвестен» при чтении заголовка ответа от восходящего потока

поэтому просто измените тип контекста безопасности для веб-корневой папки на httpd_sys_content_t

chcon -R -t httpd_sys_content_t /var/www/show




есть 3 пользователя для конфигурации nginx / php-fpm

/etc/nginx/nginx.conf

user nobody nobody;  ### `user-1`, this is the user run nginx woker process
...
include servers/*.conf;

/etc/nginx/conf.d/www.conf

location ~ \.php$ {
#   fastcgi_pass 127.0.0.1:9000;  # tcp socket
    fastcgi_pass unix:/var/run/php-fpm/fpm-www.sock;  # unix socket
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

/etc/php-fpm.d/www.conf

[www]
user = apache  ### `user-2`, this is the user run php-fpm pool process
group = apache

;listen = 127.0.0.1:9000  # tcp socket
listen = /var/run/php-fpm/fpm-www.sock  # unix socket

listen.onwer = nobody  ### `user-3`, this is the user for unix socket, like /var/run/php-fpm/fpm-www.sock
listen.group = nobody  # for tcp socket, these lines can be commented
listen.mode = 0660

пользователь-1 и пользователь-2 не обязательно должны быть одинаковыми.

для unix-сокета пользователь-1 должен быть таким же, как пользователь-3, поскольку nginx fastcgi_pass должен иметь разрешение на чтение / запись в гнезде unix.

иначе nginx получит 502 Неверный шлюз, а nginx error.log имеет следующее сообщение об ошибке

* 36 connect () для unix: /var/run/php-fpm/fpm-www.sock failed (13: Permission denied) при подключении к восходящему потоку

и пользователь / группа веб-корневой папки (/ var / www / show) не обязательно должны быть такими же, как любой из этих 3 пользователей.


1
2017-07-27 15:05





Я делал все сверху, потерял 2 часа, ударяя головой, и проблема все еще сохранялась. Наконец я сделал:

sudo service php7.0-fpm restart

И альта это сработало!

Кстати, я создал новый проект symfony 3.4 с nginx conf из ссылки: https://symfony.com/doc/3.4/setup/web_server_configuration.html

Это был мой пятый раз, когда я начал новый проект Symfony, и я не мог поверить, что это «Неизвестный первичный сценарий».


1
2018-03-11 23:19





Я нашел ваш вопрос для поиска того же сообщения об ошибке, но с использованием apache + php-fpm (no nginx). Для меня проблема была косой чертой в неправильном месте: многие предложения по настройке включают в себя строку формы:

SetHandler "proxy:unix:/path/to/file.socket|fcgi://localhost/:9000"

Поместив последнюю косую черту после номера порта следующим образом:

SetHandler "proxy:unix:/path/to/file.socket|fcgi://localhost:9000/"

проблема исчезла для меня. Может быть, вы можете сделать нечто подобное


0
2017-08-04 11:57





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

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

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

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

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


0
2018-06-01 08:24





Я клонировал удаленный сайт, а уже существующий wp-config.php имел информацию о базе данных удаленного сервера.

Я решил эту проблему, настроив свою локальную конфигурацию Wordpress с моей локальной информацией о базе данных.


0
2018-06-13 00:16