如何为fcgiwrap正确设置DOCUMENT_ROOT和SCRIPT_NAME

问题描述 投票:0回答:4

我有一个简单的脚本 cpuinfo.sh 可以运行并且可执行。

我遇到错误

*224 FastCGI 在 stderr 中发送:“无法获取脚本名称,DOCUMENT_ROOT 和 SCRIPT_NAME(或 SCRIPT_FILENAME)是否设置以及脚本可执行吗?”从上游读取响应头时,客户端:86.44.146.39,服务器:staging.example.com,请求:“GET /cpuinfo.sh HTTP/1.1”,上游:“fastcgi://unix:/var/run/fcgiwrap.套接字:”,主机:“staging.example.com”

nginx 设置是

location ~ (\.cgi|\.py|\.sh|\.pl|\.lua)$ {
    gzip off;
    autoindex on;
    fastcgi_pass unix:/var/run/fcgiwrap.socket;
    include fastcgi_params;
    fastcgi_param DOCUMENT_ROOT /home/balance/balance-infosystems-web/scripts/;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

我期待 fcgiwrap 执行

/home/balance/balance-infosystems-web/scripts/cpuinfo.sh 

我对脚本路径进行了硬编码以进行调试,但仍然遇到相同的错误。

location ~ (\.cgi|\.py|\.sh|\.pl|\.lua)$ {
    gzip off;
    autoindex on;
    fastcgi_pass unix:/var/run/fcgiwrap.socket;
    include fastcgi_params;
    fastcgi_param DOCUMENT_ROOT /home/balance/balance-infosystems-web/scripts/;
    # fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param SCRIPT_FILENAME /home/balance/balance-infosystems-web/scripts/cpuinfo.sh;
}

需要更改 nginx 服务器配置中的哪些内容才能正确执行脚本?

nginx fastcgi
4个回答
5
投票

我也有同样的问题。经过几个小时的错误方向搜索后,我终于找到了原因。事后看来,解决方案一直都在这里,就在上面,但我直到现在才意识到。

出于某种原因,在我的例子中 DOCUMENT_ROOT 的值为 /var/www/cgi-bin , SCRIPT_NAME 为 /cgi-bin/somescript.cgi 。因此,如果您以通常的方式将它们放在一起,通过编写 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name , SCRIPT_FILENAME 设置为 /var/www/cgi-bin/cgi-bin/somescript.cgi,这有点过头了,因此不起作用。修复方法是: fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name

现在,如果 FastCGI 通过 fcgiwrap 在 error.log 中不知道变量是否已设置,而是告诉我它们设置了什么,我就会立即看到解决方案。诊断信息的黄金法则:具体且精确。

我只是在运行 printenv 脚本后才发现我在某个地方撒了谎,首先明确说明其 SCRIPT_FILENAME,以便能够首先运行它。


3
投票

我发现DOCUMENT_ROOT无法重置。 我通常将脚本目录远离可公开访问的路径。 我知道脚本目录与 Web 目录处于同一级别,所以我尝试了。

location ~ (\.cgi|\.py|\.sh|\.pl|\.lua)$ {
    gzip off;
    autoindex on;
    fastcgi_pass unix:/var/run/fcgiwrap.socket;
    fastcgi_param SCRIPT_FILENAME $document_root/../scripts/$fastcgi_script_name;
    include fastcgi_params ;
}

解决了问题。


3
投票

正如其他人提到的,调试起来可能很痛苦,但 strace 非常有帮助:

strace -f -e trace=lstat64 -p $(pidof fcgiwrap)

告诉 strace 跟随 forks

-f
,仅跟踪到
lstat64
的系统调用,并告诉它附加到 fcgiwrap 的 PID
-p
。您应该得到如下输出:

[pid  1918] lstat64("{The file fastcgi is trying to load}", 0xbee94a50) = -1 ENOENT (No such file or directory)

0
投票

我可以确认 fcgiwrap 正在生成“无法获取脚本名称,DOCUMENT_ROOT 和 SCRIPT_NAME(或 SCRIPT_FILENAME)是否设置以及脚本可执行吗?”对我来说也是错误。事实证明,在我的例子中 SCRIPT_FILENAME 已正确设置,但我忽略了 /cgi-bin/ 也被传递的事实。

代表 fcgiwrap 的日志记录确实很糟糕,因为它让您认为变量根本没有设置,而它找不到文件,或者存在权限问题。绝对不够细化。

按照上面的建议

strace -f -e trace=file -p $(pidof fcgiwrap)

为我成功了。

© www.soinside.com 2019 - 2024. All rights reserved.