调试着名的 - 在stderr中发送的FastCGI:“主脚本未知”,同时从上游读取响应头

时间:2016-02-08 03:26:09

标签: php nginx

SO有很多文章都提到了这个错误代码:

FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream...

这可能意味着此错误消息或多或少无用。

消息告诉我们FastCGI处理程序不喜欢它出于某种原因发送的任何内容。问题是有时我们不知道原因是什么。

所以我重新陈述了这个问题 - 我们如何 调试 这个错误代码?

考虑一下我们有一个非常简单的网站,只有phpinfo.php文件的情况。另外,还有一个非常简单的nginx配置,如下所示:

server {
    server_name testsite.local;

    root /var/local/mysite/;

    location / {
        index index.html index.htm index.php;
    }

    location ~ \.php$ {
        include /etc/nginx/fastcgi_params;
        fastcgi_pass  fastcgi_backend;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

我们怎样才能看到输出/日志究竟是什么fastcgi_params被发送到脚本?

我们如何看到实际的错误消息?在我的情况下,我使用的是php-fpm。它在日志中没有关于此错误的信息。日志不会为此错误附加任何行。 php-fpm有详细模式吗?

/var/log/php-fpm/error.log
/var/log/php-fpm/www-error.log

我试过在php-fpm.conf文件中设置它

log_level = notice

,这在php-fpm.d / www.conf文件中:

catch_workers_output = yes

5 个答案:

答案 0 :(得分:51)

回答你的问题:

  1. 在php-fpm.d / www.conf文件中:
  2. 设置access.log条目:

    access.log = /var/log/$pool.access.log
    
    1. 重启php-fpm服务。

    2. 尝试访问您的网页

    3. cat /var/log/www.access.log,您将看到以下访问日志:

    4. - - 10/Nov/2016:19:02:11 +0000 "GET /app.php" 404 - - 10/Nov/2016:19:02:37 +0000 "GET /app.php" 404

      解决“主要脚本未知”问题:

      • 如果你看到没有正确的php文件名的“GET /”,那么这就是你的nginx conf问题。

      • 如果你看到带有404的“GET /app.php”,则意味着nginx正确传递了脚本文件名,但php-fpm无法访问此文件(用户“php-fpm:php-fpm”don无法访问你的文件,这使我陷入困境3小时)

      希望我的回答有所帮助。

答案 1 :(得分:1)

对我来说,这是一个权限问题,我不得不在php-fpm/www.conf中更改用户和组

将值更改为您的用户名和_www组

user = aqib
group = _www

答案 2 :(得分:0)

检查的位置以及它下面的文件,由于根路径TYPO ,我遇到了此错误。

答案 3 :(得分:0)

由于请求是由 php worker 处理的,你可以通过跟踪 php worker 来获取原因。

为了方便定位处理请求的worker,在php-fpm的conf文件中只设置一个worker。

pm.max_children = 1
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 1

使用 $ps -aef | grep -v grep | grep php 获取 php 工作 pid

root     28879     1  0 Apr12 ?        00:00:02 php-fpm: master process (/etc/php-fpm.conf)
www      28880 28879  0 Apr12 ?        00:00:24 php-fpm: pool www

然后用$ sudo strace -p 28880跟踪工作过程,然后做请求,你会看到如下图的跟踪输出

strace: Process 28880 attached
accept(10,

{sa_family=AF_UNIX}, [112->2]) = 4
poll([{fd=4, events=POLLIN}], 1, 5000)  = 1 ([{fd=4, revents=POLLIN}])
times({tms_utime=1388, tms_stime=1099, tms_cutime=0, tms_cstime=0}) = 1336709044
read(4, "\1\1\0\1\0\10\0\0", 8)         = 8
read(4, "\0\1\0\0\0\0\0\0", 8)          = 8
read(4, "\1\4\0\1\4U\3\0", 8)           = 8
read(4, "\17DSCRIPT_FILENAME/data/HQ/SC_Edu"..., 1112) = 1112
read(4, "\1\4\0\1\0\0\0\0", 8)          = 8
lstat("/data/www/public/st/mn/dst.php", 0x7ffce98d7170) = -1 ENOENT (No such file or directory)
stat("/data/www/public/st/mn", 0x7ffce98d9580) = -1 ENOENT (No such file or directory)
stat("/data/www/public/st", 0x7ffce98d9580) = -1 ENOENT (No such file or directory)
stat("/data/www/public", {st_mode=S_IFDIR|0774, st_size=4096, ...}) = 0
...

从跟踪输出中,它显示脚本文件 /data/www/public/st/mn/dst.php not exit

答案 4 :(得分:-1)

对于MacOs用户,万一有人遇到我的情况:

我用:

启动了php服务
sudo brew start php72
因为我使用“sudo”权限是不同的。我需要在没有sudo的情况下停止并启动php服务。

sudo brew stop php72
brew start php72

希望对某人有帮助。