摘要:无法运行任何最简单的“Hello World”FastCGI脚本,任何请求总是会终止为超时。似乎服务器和FastCGI脚本之间根本没有通信(使用动态FastCGI脚本)。
apache2.2-bin
apache2-mpm-prefork
libapache2-mod-fastcgi
libfcgi-perl
python-flup
127.0.0.1
/var/lib/apache2/fastcgi
目录,由www-data
拥有,可供所有人(所有者,群组和其他人)阅读/var/lib/apache2/fastcgi/dynamic
拥有的www-data
目录,该目录仅限于所有者(只有www-data
可读,可写且可访问)/var/lib/apache2/fastcgi/
目录目录/etc/apache2/mods-enabled/
包含对fastcgi.conf
和fastcgi.load
的引用(mod_fastcgi
已启用)。
文件fastcgi.conf
包含以下内容(保持不变,我没有编辑它):
<IfModule mod_fastcgi.c>
AddHandler fastcgi-script .fcgi
#FastCgiWrapper /usr/lib/apache2/suexec
FastCgiIpcDir /var/lib/apache2/fastcgi
</IfModule>
/etc/apache2/sites-enabled/
中的相关配置文件包含以下内容(没有其他任何关于FastCGI特定配置的内容):
<DirectoryMatch /fcgi-bin>
Options +ExecCGI
<FilesMatch "^[^\.]+$">
SetHandler fastcgi-script
</FilesMatch>
</DirectoryMatch>
存在fcgi-bin/test-perl.fcgi
,其内容为(该文件可由所有人执行,并且可由所有者和组阅读):
#!/usr/bin/perl
use CGI::Fast qw(:standard);
$COUNTER = 0;
while (new CGI::Fast) {
print header;
print start_html("Fast CGI Rocks");
print
h1("Fast CGI Rocks"),
"Invocation number ",b($COUNTER++),
" PID ",b($$),".",
hr;
print end_html;
}
存在fcgi-bin/test-python.fcgi
,其内容为(该文件可由所有人执行,并且可由所有者和组阅读):
#!/usr/bin/python
def myapp(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/plain')])
return ['Hello World!\n']
try:
from flup.server.fcgi import WSGIServer
WSGIServer(myapp).run()
except:
import sys, traceback
traceback.print_exc(file=open("errlog.txt","a"))
虽然fcgi-bin/test-perl.fcgi
和fcgi-bin/test-python.fcgi
在从命令行执行时都正常运行,但是在调用时似乎都不起作用,例如为http://test.loc/fcgi-bin/test-perl.fcgi
或http://test.loc/fcgi-bin/test-python.fcgi
。
什么都没发生,经过一段时间的延迟后,我收到错误500,Apache错误日志包含多个条目,如:
[<date>] [error] [client <IP>] FastCGI: comm with (dynamic) server "/<…>/fcgi-bin/<script>.fcgi" aborted: (first read) idle timeout (30 sec), referer: <referrer>
[<date>] [error] [client <IP>] FastCGI: incomplete headers (0 bytes) received from server "<…>/fcgi-bin/<script>.fcgi", referer: <referrer>
我花了几个小时在网上搜索,试图理解为什么它不起作用,最后决定放弃并在这里寻求帮助。
任何指针和支票清单欢迎。请随意询问您认为相关或值得检查的任何遗漏细节。
享受美好的一天。
- 编辑 -
在my own reply to my own question中,我提到了一个奇怪的案例,事情看起来很突然没有理由。我后来发现这只是部分罚款。
在同一个虚拟主机中,使用完全相同的服务器配置,一些完全相同(并具有完全相同的访问权限)的脚本将根据其位置而失败。
作为其余部分,以下是网站配置中的内容:
<DirectoryMatch /fcgi-bin>
Options +ExecCGI
<FilesMatch "^[^\.]+$">
SetHandler fastcgi-script
</FilesMatch>
</DirectoryMatch>
通过上述内容,只有/fcgi-bin
中的脚本才能作为FastCGI脚本处理。但我也有一些其他地方(仍在测试中):一个在/cgi-bin
中,另一个在/
中(即在public_html
目录中)。为此,.htaccess
包含此条目:
Options +ExecCGI
AddHandler fastcgi-script .fcgi
所以其他两个FastCGI脚本应该与/fcgi-bin
中的脚本相同,但是它们没有,并且当时它们总是以连接超时终止,就像那个{{1} { 1}}首先做了。
这让我觉得/fcgi-bin
模块可能有问题(已知错误?其他?)。到目前为止,这个模块似乎相当随机。
- 编辑2 -
第一次编辑中的上述内容是我的错误:其他脚本的组错误,它必须是mod_fastcgi
,但事实并非如此。所以有些事情是错误的,坚持我给出的答案,即尝试查看www-data
,看看它是否解决了问题,或者至少是否符合超时选项。
答案 0 :(得分:4)
我会回答我自己的问题,因为它现在似乎在起作用。然而,结语仍然看起来很奇怪。
虽然默认配置应该没问题,但我仍然想再次审核the “Module mod_fastcgi” document。由于我只想要一个动态的FastCGI,我只专注于FastCgiConfig
指令,因此故意不会进入FastCgiServer
和FastCgiExternalServer
指令。
由于默认FastCgiServer
文件中根本没有fastcgi.conf
,我开始尝试设置自己的-appConnTimeout
。对于第一次测试,我想使用fastcgi.cong
选项,至少要求服务器在它返回错误500之前不要等待很长时间。
所以我刚刚在配置虚拟主机的同一文件中添加了这个在站点配置中(我没有触及FastCgiConfig -appConnTimeout 2
):
{{1}}
这是告诉服务器等待不超过2秒,而不是等待的30秒。我试图调用FastCGI脚本来查看至少这个配置是否正常工作。我希望在2秒的延迟中得到一个错误,但是,脚本运行没有错误。
奇怪的是,我之后尝试删除此选项,以检查是否只是为了使FastCGI脚本工作而缺少的添加。但在我评论出选项之后,它仍然有效,并且在完全重启后也一样。
不能说更多,这看起来很奇怪,但这是我唯一做的事情,我没有编辑任何其他内容。我可以建议可能遇到类似问题的人,试试上面的内容。
对不起,如果我无法解释它究竟做了什么。我真的很想知道。它现在正在工作,但我不知道为什么。
答案 1 :(得分:2)
fastcgi.conf FastCgiWrapper关闭
答案 2 :(得分:0)
我的ceph radosgw根本无法得到apache的输入。在设置FastCgiWrapper Off之后,我可以在wireshark中捕获数据。