如何调试“FastCGI发送在stderr中:从上游读取响应标头时主脚本未知”并找到实际的错误消息?要回答您的问题:要解决“主脚本未知”问题,请执行以下操作:

2022-08-30 09:51:23

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

答案 1

要回答您的问题:

  1. 在 php-fpm.d/www.conf file 中:

设置访问.log条目:

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

  2. 尝试访问您的页面

  3. cat /var/log/www.access.log,你会看到这样的访问日志:

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

要解决“主脚本未知”问题,请执行以下操作:

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

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

希望我的答案有所帮助。


答案 2

由于请求由php工作线程处理,因此您可以跟踪php工作线程以获取原因。

为了便于找到哪个工作进程请求,请在 php-fpm 的 conf 文件中只设置一个工作进程。

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

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

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


推荐