apache2 FastCGI comm与动态服务器中止首次读取空闲超时

时间:2013-03-22 05:16:36

标签: apache2 fastcgi mod-fastcgi apache2-module flup

摘要:无法运行任何最简单的“Hello World”FastCGI脚本,任何请求总是会终止为超时。似乎服务器和FastCGI脚本之间根本没有通信(使用动态FastCGI脚本)。

环境

  • Ubuntu Precise(12.04)
  • 套餐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/目录
  • 中存在inode / socket文件

FastCGI相关配置:

目录/etc/apache2/mods-enabled/包含对fastcgi.conffastcgi.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.fcgifcgi-bin/test-python.fcgi在从命令行执行时都正常运行,但是在调用时似乎都不起作用,例如为http://test.loc/fcgi-bin/test-perl.fcgihttp://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,看看它是否解决了问题,或者至少是否符合超时选项。

3 个答案:

答案 0 :(得分:4)

我会回答我自己的问题,因为它现在似乎在起作用。然而,结语仍然看起来很奇怪。

虽然默认配置应该没问题,但我仍然想再次审核the “Module mod_fastcgi” document。由于我只想要一个动态的FastCGI,我只专注于FastCgiConfig指令,因此故意不会进入FastCgiServerFastCgiExternalServer指令。

由于默认FastCgiServer文件中根本没有fastcgi.conf,我开始尝试设置自己的-appConnTimeout。对于第一次测试,我想使用fastcgi.cong选项,至少要求服务器在它返回错误500之前不要等待很长时间。

所以我刚刚在配置虚拟主机的同一文件中添加了这个在站点配置中(我没有触及FastCgiConfig -appConnTimeout 2 ):

{{1}}

这是告诉服务器等待不超过2秒,而不是等待的30秒。我试图调用FastCGI脚本来查看至少这个配置是否正常工作。我希望在2秒的延迟中得到一个错误,但是,脚本运行没有错误。

奇怪的是,我之后尝试删除此选项,以检查是否只是为了使FastCGI脚本工作而缺少的添加。但在我评论出选项之后,它仍然有效,并且在完全重启后也一样。

不能说更多,这看起来很奇怪,但这是我唯一做的事情,我没有编辑任何其他内容。我可以建议可能遇到类似问题的人,试试上面的内容。

对不起,如果我无法解释它究竟做了什么。我真的很想知道。它现在正在工作,但我不知道为什么。

答案 1 :(得分:2)

#############

fastcgi.conf    FastCgiWrapper关闭

答案 2 :(得分:0)

peng.rl的回答解决了我的问题。

我的ceph radosgw根本无法得到apache的输入。在设置FastCgiWrapper Off之后,我可以在wireshark中捕获数据。