如何为fcgiwrap正确设置DOCUMENT_ROOT和SCRIPT_NAME

时间:2016-08-08 12:10:51

标签: nginx fastcgi

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

我收到错误

* 224在stderr中发送的FastCGI:“无法获取脚本名称,是DOCUMENT_ROOT和SCRIPT_NAME(或SCRIPT_FILENAME)设置并且是脚本可执行文件吗?”从上游读取响应头时,客户端:86.44.146.39,server:staging.example.com,请求:“GET /cpuinfo.sh HTTP / 1.1”,上游:“fastcgi:// unix:/ var / run / fcgiwrap。 socket:“,host:”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服务器配置中需要更改哪些内容才能正确执行脚本?

2 个答案:

答案 0 :(得分:1)

我发现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 ;
}

解决了这个问题。

答案 1 :(得分:1)

我遇到了同样的问题。在错误的方向搜索了太多小时后,我终于找到了原因。事后看来,解决方案一直都在,就在上面,但我现在才意识到这一点。

出于某种原因,在我的情况下,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,以便能够首先运行它。