我第一次使用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权限...

我最好的猜测是配置出了点问题,但是我做不到弄清楚...

UPDATE
,所以我将其移至/var/www/并使用了更基本的配置:另外,如果我打电话给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和更多内容...

#1 楼

错误消息“未知的主脚本”几乎总是与在nginx SCRIPT_FILENAME指令中错误设置的fastcgi_param有关的(或者权限错误,请参见其他答案)。

您在配置中使用的是if首先发布。好吧,现在应该知道,如果它是邪恶的,并且经常会产生问题。您可以尝试以下操作:

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;
    }
}


请注意,上面的配置未经测试。您应该先执行root,然后再应用它来检查nginx可以立即检测到的问题。

评论


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

–b01
2014年3月14日14:32在

在哪里可以了解有关在位置设置根的不良做法的更多信息?

– Dan Dascalescu
15年6月17日在9:20

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

–igorsantos07
2015年8月30日在22:53



是的,请确保:nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/…

–绞肉机
2015年10月3日,12:18

什么是yii_bootstrap?

–爱
17年6月1日在6:42

#2 楼

并非总是SCRIPT_FILENAME是错误的。
也可能是PHP以错误的用户/组身份运行。设置最麻烦(相比之下,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文件。默认情况下,它具有:

user = _www
group = _www


在OS X上,您可能需要将其更改为:

user = [your username]
group = staff


(您应该发现它与document_root的www.conf相匹配)

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

添加到ls -lh的主要http

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


(其中的第一位必须是您当前正在使用的任何东西,因此您可以查看它是否正确。) />并使用您刚定义的日志,请在您站点的/usr/local/etc/nginx/nginx.conf块中:

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


如果正确,将请求example.com/phpinfo.php生成就像是 this:

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


可以简化现有配置吗?

您是否正在使用从互联网某处复制/粘贴的server块?大多数软件包使您可以更快,更干净地执行此操作。例如在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)之类的内容位于location ~ \.php {中。 />永远不要在PHP位置块中重复/usr/local/etc/nginx/snippets/fastcgi-php.conf

评论


非常好!是给我的!队友的欢呼声!

– rollsappletree
16年8月30日在9:38

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

–Tek
16年11月17日在19:37

@Fleshgrinder的答案是错误的,而您的答案是正确的!就我而言,确实只是纠正/etc/php/7.0/php-fpm.d/www.conf文件中的所有权的问题。为您加油,蓓蕾。 :)随着无业游民的受欢迎程度持续增长,更多的人可能也开始看到此问题。

–user392778
17年5月16日在7:29

在我的Mac上/usr/local/etc/nginx/snippets/fastcgi-php.conf中找不到任何内容。但是我确实找到了/usr/local/etc/nginx/fastcgi.conf

–abbood
17年12月31日在0:29

好一个!!挣扎了几个小时

– fonini
19-10-9在20:40

#3 楼

好了,经过一天的挣扎,我发现了3件事


由于某种原因,我已经在9000端口上运行了某些东西,所以我更改为9001
我的默认设置网站正在拦截我的新网站,我再次
理解为什么不应该这样做,但是我只是取消了链接
Nginx不会自动为网站提供符号链接-可用于
启用了站点。

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

评论


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

– Manish足pk
15年11月26日在6:28

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

–Erathiel
16年8月2日在13:30

@Erathiel s /不希望的/废话。使用这些符号链接启用和禁用它们是主要思想。

– F8ER
20年11月9日在16:34

#4 楼

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

#5 楼

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

客户端获得响应


找不到文件。


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


* 19 stderr中发送了FastCGI:“主要脚本未知”,同时从上游读取响应头br />所以只需将Web根文件夹的安全上下文类型更改为httpd_sys_content_t

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



nginx / php-fpm config有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套接字,用户1必须与用户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个用户中的任何一个相同。

#6 楼

我也遇到了这个问题,我通过交换include fastcgi_paramsfastcgi_param SCRIPT_FILENAME ...这行来解决了。

独立的nginx设置了每个FastCGI参数的最后一个值,因此您必须将值放在fastcgi_params。

#7 楼

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

步骤:


exec setenforce 0
U也需要修改配置文件

vim /etc/selinux/config set SELINUX to disabled

#8 楼

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

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

然后尝试重新启动nginx。

评论


另外,请考虑验证php-fpm用户是否共享nginx组。例如,如果nginx作为www-data运行并且php-fpm作为php-fpm运行,则sudo usermod -a -G www-data php-fpm。

– F8ER
20年11月9日在16:32



#9 楼

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

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


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

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


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

#10 楼

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

sudo service php7.0-fpm restart


中提琴奏效了!

顺便说一句,我正在通过链接从nginx conf设置新的symfony 3.4项目:
https://symfony.com/doc/3.4/setup/web_server_configuration.html

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

#11 楼

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

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

搜索并阅读了许多文章,这篇文章似乎总结了所有可能的情况,并且我都尝试了它们:不是
404抛出错误,加上一个裸字符串“找不到文件”,不是由nginx引起的。
root添加到服务器,无法正常工作。问题根目录和子文件夹相同
检查php-fpm手册以获取错误代码解释,找不到一个
打开php-fpm访问日志,发现请求URI正确,但是返回404
尝试为php-fpm启用详细/调试模式,但不起作用,假定的错误日志文件始终为空

所以我不得不尝试最后一招,因为php根文件夹在工作而子文件夹不是,唯一的除了root之外,它们之间的主要区别是使用了根文件夹$request_filename以及使用了子文件夹位置$document_root$fastcgi_script_name,所以我更改了子文件夹位置设置以匹配根文件夹的设置。不知道为什么它起作用。因为当我检查php-fpm访问日志时,我看到相同的URI,一个是404,另一个是200。

q唯一的区别在于配置。由于它们产生相同的输出,所以我不知道为什么结果会有所不同。

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

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

#12 楼

对我来说是扩展。

我的php-fpm.www.access.log正在报告:

"GET /index.php5" 404


该站点(MediaWiki)的索引文件是index.php。原来我在相关的php条目中混合了扩展名(php5nginx.conf)。这是一个有效的配置:

location / {
    index index.php;
    try_files $uri $uri/ = @mediawiki;
}
location = /favicon.ico {
    return 204;
}
location ~ \.php$ {
    fastcgi_pass unix:/var/run/php-fpm.sock;
    include fastcgi_params;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /path/to/viki$fastcgi_script_name;
    fastcgi_param DOCUMENT_ROOT /path/to/viki;
    fastcgi_intercept_errors on;
}

location @mediawiki {
    rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=&$args last;
}


所有这些条目都可以使用index.php5代替,只需将index.php5文件添加到具有以下内容的根目录即可:

<?php require './index.php';


(无结束标签)。

#13 楼

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

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


评论


root指令应在每台服务器上设置,并且不应在任何位置块内使用(除非您是专业人士,并且想避开配置中一些非常特殊的nginx错误)。

–绞肉机
2014年10月4日在17:42

@Fleshgrinder每台服务器一个根不是最佳实践。

–加勒特·克拉伯恩(Garet Claborn)
2015年10月3日在2:58



是的,请确保:nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/…

–绞肉机
2015年10月3日,12:18

@Fleshgrinder这不是您链接的部分所说的。该部分的良好做法示例显示了location块内的root指令。

–ishigoya
18年1月28日在17:06

@ishigoya,请再次访问该链接,多个位置块中的多个根指令显然位于BAD标题下。

–绞肉机
18年1月29日在17:52

#14 楼


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

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

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

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

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


#15 楼

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

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