如何为 fcgiwrap 正确设置 DOCUMENT_ROOT 和 SCRIPT_NAME
How to set DOCUMENT_ROOT and SCRIPT_NAME correctly for fcgiwrap
我有一个简单的脚本 cpuinfo.sh 可以运行并且可以执行。
我遇到错误
*224 FastCGI 在 stderr 中发送:"Cannot get script name, are DOCUMENT_ROOT and SCRIPT_NAME (or SCRIPT_FILENAME) set and is the script executable?" 同时从上游读取响应 header,客户端:86.44.146.39,服务器:staging.example.com,请求:"GET /cpuinfo.sh HTTP/1.1",上游:"fastcgi://unix:/var/run/fcgiwrap.socket:",主机:"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 服务器配置中更改什么才能正确执行脚本?
我发现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 ;
}
解决了问题。
我遇到了同样的问题。在错误的方向上搜索了太多小时之后,我终于找到了原因。事后看来,解决方案一直都在这里,就在上面,但我现在才意识到。
出于某种原因,在我的例子中 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 在 error.log 中通过 fcgiwrap 没有想知道是否设置了变量,而是告诉我它们设置了什么,我会立即看到解决方案。诊断信息的黄金法则:具体、准确。
我只是在 运行 设置了我在某处放置的 printenv 脚本后才发现,首先明确说明它的 SCRIPT_FILENAME,以便能够首先 运行 它。
我有一个简单的脚本 cpuinfo.sh 可以运行并且可以执行。
我遇到错误
*224 FastCGI 在 stderr 中发送:"Cannot get script name, are DOCUMENT_ROOT and SCRIPT_NAME (or SCRIPT_FILENAME) set and is the script executable?" 同时从上游读取响应 header,客户端:86.44.146.39,服务器:staging.example.com,请求:"GET /cpuinfo.sh HTTP/1.1",上游:"fastcgi://unix:/var/run/fcgiwrap.socket:",主机:"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 服务器配置中更改什么才能正确执行脚本?
我发现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 ;
}
解决了问题。
我遇到了同样的问题。在错误的方向上搜索了太多小时之后,我终于找到了原因。事后看来,解决方案一直都在这里,就在上面,但我现在才意识到。
出于某种原因,在我的例子中 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 在 error.log 中通过 fcgiwrap 没有想知道是否设置了变量,而是告诉我它们设置了什么,我会立即看到解决方案。诊断信息的黄金法则:具体、准确。
我只是在 运行 设置了我在某处放置的 printenv 脚本后才发现,首先明确说明它的 SCRIPT_FILENAME,以便能够首先 运行 它。