【问题标题】:How to set DOCUMENT_ROOT and SCRIPT_NAME correctly for fcgiwrap如何为 fcgiwrap 正确设置 DOCUMENT_ROOT 和 SCRIPT_NAME
【发布时间】:2016-08-08 12:10:50
【问题描述】:

我有一个简单的脚本 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


    【解决方案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,以便能够首先运行它。

    【讨论】:

    • 我使用“strace”“/usr/sbin/fcgiwrap”进程来查看它试图访问的文件。确实不太方便。
    • 这对我来说也是一场噩梦。
    【解决方案2】:

    我发现 DOCUMENT_ROOT 无法重置。 我通常有远离可公开访问路径的脚本目录。 我知道scripts目录和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 ;
    }
    

    解决了这个问题。

    【讨论】:

      猜你喜欢
      • 2023-04-07
      • 1970-01-01
      • 2017-06-02
      • 2019-02-04
      • 2014-06-11
      • 2023-03-24
      • 2018-11-18
      • 2020-01-03
      • 1970-01-01
      相关资源
      最近更新 更多