gpt4 book ai didi

具有动态服务器的 apache2 FastCGI 通信中止了第一次读取空闲超时

转载 作者:行者123 更新时间:2023-12-02 16:36:26 25 4
gpt4 key购买 nike

摘要:无法运行任何最简单的“Hello World”FastCGI 脚本,任何请求总是以超时终止。似乎服务器和 FastCGI 脚本之间根本没有通信(使用动态 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目录,归 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_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>

    测试虚拟主机上的测试 Material :

    存在一个 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 中的一样工作。 ,但它们没有,并且在当时,它们总是以连接超时终止,就像 /fcgi-bin 一样首先做了。

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

    -- 编辑 2 --

    第一次编辑中的上述内容是我的错误:该组与其他脚本有误,它必须是 www-data ,但事实并非如此。所以是不是有问题,坚持我给的答案,就是试试看 FastCgiConfig ,看看它是否解决了任何问题,或者至少它是否支持超时选项。

    最佳答案

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

    虽然默认配置应该没问题,但我还是想回顾一下the “Module mod_fastcgi” document再次。因为我只想要一个动态的 FastCGI,所以我专注于 FastCgiConfig仅指令,因此故意不进入 FastCgiServerFastCgiExternalServer指令。

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

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

    FastCgiConfig -appConnTimeout 2

    这是告诉服务器等待不超过 2 秒,而不是等待 30 秒。我试图调用一个 FastCGI 脚本来查看至少这个配置是否有效。我预计会在 2 秒延迟后出现错误,但脚本运行时没有出现错误。

    奇怪的是,我随后尝试删除此选项,以检查是否只是缺少使 FastCGI 脚本正常工作的添加。但是在我注释掉该选项之后,它仍然可以工作,并且在完全重新启动后也是如此。

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

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

    关于具有动态服务器的 apache2 FastCGI 通信中止了第一次读取空闲超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15563217/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com