在stderr中发送的Nginx 1 FastCGI:“主要脚本未知”


81

我第一次使用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拥有(我的Web用户运行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菲律宾比索,这意味着它在那里提供服务。它只是不提供console.ordercloud ...


另一个可能的原因:如果您使用的是php-fpm,请确保/etc/php-fpm.d/www.conf中设置的用户具有尝试运行的脚本的权限。我认为它默认为apache。
戴夫

另一个可能的原因是您的SElinux已启用,请检出SElinux配置并禁用它。
阮阮

我只是将主机配置从FCGId(以虚拟服务器所有者身份运行)切换为FPM(以虚拟服务器所有者身份运行)。除了安装PhP 7.2-fpm,cli和其他功能外,
PauloBoaventura

Answers:


92

错误消息“未知的主要脚本” 几乎总是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可以立即检测到的问题。


1
这为我解决了;我不知道您必须在$ document_root前面加上前缀,我认为它是根据root自动执行的。
b01

3
在哪里可以了解有关设置root内部位置的错误做法的更多信息?
Dan Dascalescu 2015年

15
对于那些不完全了解该变量可能有什么错误的人:在Nginx主http节中添加以下内容:(log_format scripts '$document_root$fastcgi_script_name > $request';或任何您要馈送给SCRIPT_FILENAME的内容)以及您的serveraccess_log /var/log/nginx/scripts.log scripts。重新加载并查看您的新脚本日志;)
igorsantos07


3
什么是yii_bootstrap?

43

这不是总是SCRIPT_FILENAME是错误的。
也可能是PHP以错误的user / group运行

这个例子是特定于Mac OS X的,根据我的经验,这是最麻烦的设置(相比之下,Debian很容易)-我刚刚使用自制软件和出色的josegonzalez软件包从PHP 5.6升级到7.0 。

问题是创建了配置文件的新副本。

主要配置文件是/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您的document_root 相匹配)

不幸的是,如果不进行此更改,即使 Nginx 在正确的位置查找文件,您仍然会在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窃取)

添加到httpmain块/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.conffastcgi_param设置列表,包括关键的SCRIPT_FILENAME。

永远不要root在PHP位置块中重复。


2
非常好!是给我的!队友的欢呼声!
rollsappletree '16

谢谢。对我来说,我正在运行的fpm / nginx docker容器在访问这些文件夹时存在权限问题。
Tek

@Fleshgrinder的答案是错误的,而您的答案是正确的!就我而言,确实只是纠正/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

好东西!!挣扎了几个小时
fonini

7

好吧,经过一天的努力,我发现了3件事

  1. 由于某种原因,我已经在9000端口上运行了某些软件,所以我改为9001
  2. 我的默认网站拦截了我的新网站,我再次不明白为什么不这样做,但是我只是取消了链接
  3. Nginx不会自动为可用站点启用站点的符号链接。

希望这可以节省一些麻烦!


您好@ we0,我的设置也遇到了同样的问题。我也在端口3001上运行了另一个应用程序,因此我必须在端口3002上托管我的php应用程序。您可以在这里看到我的原始帖子:stackoverflow.com/questions/33229867/…stackoverflow.com/questions/33409539/…另一个是stackoverflow.com/questions/33519989/…。你有什么主意吗?
Manish Sapkal,2015年

3
从站点可用站点到启用站点自动建立符号链接是不希望的。取决于您如何建立这些符号链接,以便您可以控制服务器上哪些站点“打开”和哪些站点“关闭”。
Erathiel '16

6

较新的Nginx(v1.8)遇到了相同的问题。较新版本建议使用snippets/fastcgi-php.conf;代替fastcgi.conf。因此,如果您include fastcgi.conf从教程中复制/粘贴,则可能会Primary script unknown在日志中出现错误。


4

“主要脚本未知”是由SELinux安全上下文引起的

客户得到回应

文件未找到。

nginx error.log具有以下错误消息

* 19从上游读取响应头时,stderr中发送了FastCGI:“主脚本未知”

因此只需将Web根文件夹的安全上下文类型更改为httpd_sys_content_t

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




nginx / php-fpm配置有3个用户

/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套接字,user-1必须与user-3相同, 因为nginx fastcgi_pass必须对unix套接字具有读/写权限。

否则nginx将获得502 Bad Gateway,并且nginx error.log具有以下错误消息

* 36连接到Unix的connect():/ var / run / php-fpm / fpm-www.sock失败(13:权限被拒绝),同时连接到上游

并且Web根文件夹的用户/组(/ var / www / show)不必与这3个用户中的任何一个相同。


2

我也遇到了这个问题,我通过换行include fastcgi_params和解决了这个问题fastcgi_param SCRIPT_FILENAME ...

实际上,nginx会设置每个FastCGI参数的最后一个值,因此您必须将值放在fastcgi_params中包含的默认值之后。


1

我通过在CentOS7.3系统中关闭SELINUX解决了这个问题

脚步:

  • 执行 setenforce 0
  • U还需要修改配置文件

vim /etc/selinux/config set SELINUX to disabled


0

我发现您的问题正在寻找相同的错误消息,但使用的是apache + php-fpm(无nginx)。对我来说,问题是在错误的地方加了斜杠:许多设置建议包括以下形式的一行:

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

通过在端口号之后放置最后一个斜杠,如下所示:

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

这个问题对我不见了。也许你可以做类似的事情


0

我遇到相同的问题,但是其他方法并没有帮助我解决问题!

我解决了,我发现关键是: Linux用户权限导致问题:stderr中发送的FastCGI:“主脚本未知”

因为PHP-FPM的默认user:group是apache:apache,但是您的代码目录是someBody:someBody。因此,您应该更改用户权限!

我写了一个博客来解决这个问题,您可以看到这个博客:

[在stderr中发送的Nginx FastCGI:“主脚本未知”] [1]`[1]:http : //geekhades.blogspot.com/2017/06/nginx-fastcgi-sent-in-stderr-primary.html


0

我克隆了一个远程站点,并且已经存在的wp-config.php具有远程服务器数据库信息。

我通过使用本地数据库信息设置本地wordpress配置来解决此问题。


0

我从上面进行了所有操作,损失了2个小时的撞击声,问题仍然存在。最后我做了:

sudo service php7.0-fpm restart

中提琴奏效了!

顺便说一句,我正在使用Nginx conf通过以下链接建立新的symfony 3.4项目:https : //symfony.com/doc/3.4/setup/web_server_configuration.html

那是我第五次开始新的symfony项目,而且我不敢相信这种“主要脚本未知”正在发生。


0

检查您的php-fpm sock文件的权限,以某种方式无法访问它:

chmod 755 /usr/local/var/run/php-fpm.sock

然后尝试重新启动Nginx。


0

很久以来,我一直被这个奇怪的消息所困。我不确定原因,因为一切都工作了一段时间,然后突然停止了工作。

我在Lightsail上使用Bitnami / Nginx缩短了MediaWiki规定的Wiki URL。

搜索并阅读了许多帖子,这篇文章似乎总结了所有可能的情况,我尝试了所有这些情况:

  • nginx很好,根文件夹php工作正常,子文件夹不工作
  • 错误抛出为404 +裸字符串“找不到文件”,不是由nginx引起的
  • 添加root到服务器,不起作用
  • 检查文件夹和php-fpm / nginx的权限,没有问题,根目录和子文件夹相同
  • 检查php-fpm手册中的错误代码解释,找不到一个
  • 打开php-fpm访问日志,发现请求URI正确,但返回404
  • 尝试为php-fpm启用详细/调试模式,但不起作用,假定的错误日志文件始终为空

因此,我不得不尝试最后一招,因为root文件夹php可以工作而子文件夹不起作用,除了它们之间的唯一主要区别在于root使用的根文件夹$request_filename和使用的子文件夹位置$document_root以及$fastcgi_script_name,因此我更改了子文件夹位置设置以匹配根文件夹的设置。

然后它起作用了……我仍然不确定为什么起作用。因为当我检查php-fpm访问日志时,我看到相同的URI,一个是404,另一个是200。

在此处输入图片说明

唯一的区别在于配置。由于它们产生相同的输出,因此我不知道为什么得出不同的结果。

无论如何,我决定在这里寄出2美分,希望这对您有所帮助。

PS:我确实希望PHP提供更好的错误消息和详细模式,因为这确实使无法解决问题以及无法查看详细输出和调试信息感到沮丧。


-1

尝试在您的php位置添加root指令。

location ~ \.php {
      root /home/willem/git/console/www;
      ...
}

1
root指令应基于每个对象设置,server并且不应在任何location块中使用(除非您是专业人士,并且想避开配置中一些非常特殊的nginx错误)。
Fleshgrinder 2014年

1
@Fleshgrinder每个服务器一个根不是最佳实践。
加雷特·克拉伯恩(Garet Claborn)


@Fleshgrinder这不是您链接的部分所说的。该部分中的良好实践示例显示rootlocation块内的指令。
ishigoya

@ishigoya,请再次访问该链接,root多个location块内的多个指令显然位于BAD标题下。
Fleshgrinder
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.