带有动态服务器的apache2 FastCGI通信中止首次读取空闲超时
摘要:无法运行任何最简单的“Hello World”FastCGI脚本,任何请求总是在超时时终止。服务器和FastCGI脚本(使用动态FastCGI脚本)之间似乎根本没有通信 环境带有动态服务器的apache2 FastCGI通信中止首次读取空闲超时,apache2,fastcgi,mod-fastcgi,apache2-module,flup,Apache2,Fastcgi,Mod Fastcgi,Apache2 Module,Flup,摘要:无法运行任何最简单的“Hello World”FastCGI脚本,任何请求总是在超时时终止。服务器和FastCGI脚本(使用动态FastCGI脚本)之间似乎根本没有通信 环境 Ubuntu精确版(12.04) 包装apache2.2-bin 软件包apache2 mpm预工作 软件包libapache2 mod fastcgi 包libfcgiperl 包pythonflup 在127.0.0.1 存在一个/var/lib/apache2/fastcgi目录,由www-data所有,可供
- Ubuntu精确版(12.04)
- 包装
apache2.2-bin
- 软件包
apache2 mpm预工作
- 软件包
libapache2 mod fastcgi
- 包
libfcgiperl
- 包
pythonflup
- 在
127.0.0.1
- 存在一个
目录,由/var/lib/apache2/fastcgi
所有,可供所有人(所有者、组和其他人)读取www-data
- 存在一个
目录,由/var/lib/apache2/fastcgi/dynamic
所有,该目录仅限于所有者(只能由www-data
读取、写入和访问)www-data
目录中存在一个inode/socket文件/var/lib/apache2/fastcgi/
/etc/apache2/mods enabled/
包含对fastcgi.conf
和fastcgi.load
(mod\u fastcgi
已启用)的引用
文件fastcgi.conf
包含以下内容(保持不变,我没有编辑它):
测试虚拟主机上的测试材料:
存在一个fcgi-bin/test perl.fcgi
,其内容是(该文件可由所有人执行,并且可由所有者和组读取):
存在一个fcgi-bin/test-python.fcgi
,其内容是(该文件可由所有人执行,并且可由所有者和组读取):
问题
虽然从命令行执行时,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>
因此,另外两个FastCGI脚本的工作原理应该与/fcgi-bin
中的脚本相同,但它们没有,而且目前它们总是以连接超时终止,就像第一个/fcgi-bin
一样
这让我觉得mod_fastcgi
模块可能有问题(已知错误?其他?)。到目前为止,这个模块的行为似乎相当随机
--编辑2--
第一次编辑中的上述内容是我的一个错误:该组与其他脚本有误,它必须是
www-data
,但事实并非如此。因此,如果出现问题,请坚持我给出的答案,即尝试查看FastCgiConfig
,看看它是否解决了任何问题,或者至少它是否尊重超时选项。我将回答我自己的问题,因为它现在似乎正在工作。然而,结尾看起来仍然很奇怪
虽然默认配置应该是可以的,但我仍然希望再次查看。因为我只想要一个动态的FastCGI,所以我只关注FastCgiConfig
指令,因此故意不进入FastCgiServer
和FastCgiExternalServer
指令
由于默认的fastcgi.conf
文件中根本没有FastCgiServer
,我开始尝试设置自己的文件。对于第一个测试,我想使用-appConnTimeout
选项,至少请求服务器不要等待太久,然后返回错误500
所以我只是在站点配置中添加了这个(我没有触摸fastcgi.cong
),在配置虚拟主机的同一个文件中:
FastCgiConfig -appConnTimeout 2
这是告诉服务器等待时间不要超过2秒,而不是它等待的30秒。我试图调用一个FastCGI脚本,看看至少这个配置是否正常工作。我希望在2秒钟的延迟内得到一个错误,但是相反,脚本运行时没有错误
奇怪的是,我随后试图删除这个选项,以检查是否只是添加了使FastCGI脚本正常工作的内容。但在我注释掉该选项后,它仍然在工作,完全重新启动后也是如此
说不出更多,这看起来很奇怪,但这是我做的唯一一件事,我没有编辑任何其他内容。我可以建议可能遇到类似问题的人尝试上述方法
对不起,如果我不能解释它到底做了什么。我真的很想知道。它现在正在工作,但我不知道为什么。#############
fastcgi.conf
FastCgiWrapper关闭peng.rl的答案解决了我的问题
我的ceph radosgw根本无法获得apache的输入。将FastCgiWrapper设置为Off后,我可以在wireshark中捕获数据。最后,它并不总是工作。还有一个问题。请参阅更新的初始消息,以说明此新问题。到目前为止,我对自己的问题的回答只是部分的。最后还行(见第一篇文章)。答案虽然没有说明如何解决,但确实足以解决这个问题。
#!/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;
}
#!/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"))
[<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>
<DirectoryMatch /fcgi-bin>
Options +ExecCGI
<FilesMatch "^[^\.]+$">
SetHandler fastcgi-script
</FilesMatch>
</DirectoryMatch>
Options +ExecCGI
AddHandler fastcgi-script .fcgi
FastCgiConfig -appConnTimeout 2