带有动态服务器的apache2 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所有,可供

摘要:无法运行任何最简单的“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
    所有,可供所有人(所有者、组和其他人)读取
  • 存在一个
    /var/lib/apache2/fastcgi/dynamic
    目录,由
    www-data
    所有,该目录仅限于所有者(只能由
    www-data
    读取、写入和访问)
  • /var/lib/apache2/fastcgi/
    目录中存在一个inode/socket文件
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