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

我第一次使用Nginx,但是我更熟悉Apache和Linux。 我正在使用一个现有的项目,当我试图看到index.php我得到一个404文件未find。

这里是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权限出于挫折感。

我最好的猜测是configuration有问题,但我无法弄清楚…

更新所以我把它移动到/var/www/并使用了一个更基本的configuration:

 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 …

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

您在首次发布的configuration中使用了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; } } 

请注意,上述configuration未经testing。 在应用它之前,你应该执行nginx -t来检查nginx能够立即检测到的问题。

SCRIPT_FILENAME并不总是错的。
也可能是PHP作为错误的用户/组运行

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

问题是创build了一个新的configuration文件副本。

主要的configuration文件是/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 

(你会发现这匹配你的document_root的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 

如何validation脚本文件名是否正确:

(从另一个答案igorsantos07偷)

添加到主/usr/local/etc/nginx/nginx.conf http块中:

 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 

你能简化你现有的configuration吗?

您是否正在使用location ~ \.php {阻止您从互联网上的某处复制/粘贴? 大多数软件包允许您更快速,更干净地完成。 例如在OS X上,你现在只需要这个:

 location ~ \.php { fastcgi_pass 127.0.0.1:9000; include snippets/fastcgi-php.conf; # any site specific settings, eg 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。

不要在PHP位置块中复制root

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

  1. 出于某种原因,我已经在9000端口上运行了,所以我改成了9001
  2. 我的默认网站拦截了我的新网站,我再一次不承认为什么,因为它不应该,但我只是断开它
  3. Nginx不会自动为网站启用站点的sym链接。

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

有一个更新的nginx(v1.8)相同的问题。 较新的版本推荐使用snippets/fastcgi-php.conf; 而不是fastcgi.conf 。 所以如果从教程中复制/粘贴include fastcgi.conf ,最终可能会在日志中出现Primary script unknown错误。

我也有这个问题,我解决了交换行include fastcgi_paramsfastcgi_param SCRIPT_FILENAME ...

事实上,nginx设置了每个FastCGI参数的最后一个值,所以你必须把你的值放在fastcgi_params中包含的默认值之后。

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

客户得到回应

文件未find。

nginx error.log有以下错误信息

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

所以只需将Web根文件夹的安全上下文types更改为httpd_sys_content_t

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

有3个用户为nginx / php-fpmconfiguration

/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:/var/run/php-fpm/fpm-www.sock失败(13:权限被拒绝),同时连接到上游

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

我发现你的问题寻找相同的错误信息,但使用Apache + PHP-FPM(无Nginx的)。 对我来说,问题是在一个错误的地方的斜线:许多设置build议包括一行的forms:

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

通过在端口号之后放置最后的斜线,如下所示:

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

这个问题对我来说消失了。 也许你可以做类似的事情

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

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

因为PHP-FPM默认用户:group是apache:apache,但是你的代码目录是someBody:someBody。 所以你应该改变用户权利!

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

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

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

我解决了这个问题,通过设置我本地的wordpressconfiguration,与我本地的数据库信息。

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

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