这是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服务... #1 楼
错误消息“未知的主脚本”几乎总是与在nginxSCRIPT_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_params
和fastcgi_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
条目中混合了扩展名(php5
与nginx.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配置来解决此问题。
评论
另一个可能的原因:如果您使用的是php-fpm,请确保/etc/php-fpm.d/www.conf中设置的用户具有尝试运行的脚本的权限。我认为它默认为apache。另一个可能的原因是您的SElinux已启用,请检出SElinux配置并将其禁用。
我只是将主机配置从FCGId(以虚拟服务器所有者身份运行)切换为FPM(以虚拟服务器所有者身份运行)。除了安装PhP 7.2-fpm,cli和更多内容...