2013-03-22 46 views
4

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

环境

  • Ubuntu的精确(12.04)
  • apache2.2-bin
  • apache2-mpm-prefork
  • libapache2-mod-fastcgi
  • libfcgi-perl
  • python-flup
  • 多个站点配置为虚拟主机上127.0.0.1
  • 由所有(所有者,组等)
  • 存在一个/var/lib/apache2/fastcgi/dynamic目录,由www-data拥有,被限制为存在一个/var/lib/apache2/fastcgi目录,由www-data拥有,可读所有者(可读,可写和由www-data仅访问)
  • 有存在于/var/lib/apache2/fastcgi/目录

FastCGI的相关配置一个inode /插座文件:

目录/etc/apache2/mods-enabled/保存对fastcgi.conffastcgi.loadmod_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,但他们不这样做,而且当时,他们都不约而同地用一个联接时间终止-out,就像第一次做的/fcgi-bin一样。

这让我觉得mod_fastcgi模块(已知bug?else?)可能有问题。到目前为止,这个模块似乎是相当随机的。

- 编辑2 -

第一编辑以上,是我的一个错误:该组是不对的其他脚本,它必须是www-data,但事实并非如此。所以有些事情是错误的,坚持我给出的答案,那就是试着看看FastCgiConfig,看看它是否能解决任何问题,或者至少是否能够解决超时问题。

回答

4

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

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

由于缺省fastcgi.conf文件中完全没有FastCgiServer,我开始尝试设置自己的文件。对于第一次测试,我想使用-appConnTimeout选项,至少要求服务器在返回错误500之前不要等太久。

所以我只是在网站配置中添加了这个(我没有触摸fastcgi.cong),在同一文件中,其中虚拟主机被配置:

FastCgiConfig -appConnTimeout 2 

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

有什么奇怪的是,我试图删除这个选项,以检查它是否只是缺少使FastCGI脚本工作的添加。但是在我评论了这个选项后,它仍然在工作,而且在完全重新启动之后仍然如此。

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

对不起,如果我不能解释它到底做了什么。我真的很想知道。它现在只是在工作,但我不知道为什么。

+0

最后它并不总是工作。还有一个问题。看到最新的消息是更新来说明这个新问题。我对自己的问题的回答仅仅是部分内容。 – Hibou57 2013-03-22 08:43:22

+0

最后确定(请参阅第一篇文章)。答案虽然没有说明如何,但确实足以解决这个问题。 – Hibou57 2013-03-22 10:08:25

2
#############

fastcgi.conf FastCgiWrapper关

0

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

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