0

所以可以说有一个服务器进程需要太长时间。客户抱怨它“超时”。

如果我错了,请纠正我,但这个特定的超时可能与 apache 的超时设置有关,但不一定。我相信情况确实如此,因为在测试有问题的页面时,我们无法让它可靠地超时——大多数情况下,浏览器只会旋转多久。

如果与客户端的连接出现问题,超时设置将生效,如文档中所述。但如果连接正常,则由客户端关闭连接(我相信)。

我假设这也意味着如果客户端关闭他们的浏览器,Apache 将达到超时限制(在我的例子中为 300 秒),并终止进程。情况似乎并非如此。

这是我测试它的方法:
我在服务器上的一些代码中添加了一个 while 循环:

too_long = 2000
tstart = time.time()
f = open('/tmp/timeout_test.txt', 'w')
while True:
    time.sleep(100)
    elapsed = time.time() - tstart
    f.write('Loop, %s elapsed\n' % elapsed)
    if elapsed > too_long:
        break

然后我打开网页以启动该循环,并在服务器上运行 netstat:

~$ netstat -np | grep ESTAB | grep apache
tcp        0      0 10.102.123.6:443        10.102.119.101:53519    ESTABLISHED 16534/apache2
tcp        0      0 127.0.0.1:60299         127.0.0.1:5432          ESTABLISHED 16534/apache2

(那是我在 10.102.119.101,服务器在 10.102.123.6)
然后我关闭了浏览器并重新运行了 netstat 行:

~% netstat -np | grep ESTAB | grep apache
tcp        0      0 127.0.0.1:60299         127.0.0.1:5432          ESTABLISHED 16534/apache2

我的连接消失了,但服务器仍在循环中,我可以通过运行来确认:

~% lsof | grep timeout
apache2   16534   www-data   14w      REG        8,1        0     536533 /tmp/timeout_test.txt 

这意味着 apache 进程仍然打开该文件。在接下来的 2000 秒内,当我运行时:

~% cat /tmp/timeout_test.txt

我什么都没有。2000 秒后,netcat 行什么也没有产生,tmp 文件被 while 循环的输出填充。

因此,无论客户端连接如何,似乎 Apache 进程都只是按照要求执行的操作?那个环回连接是关于什么的?

4

1 回答 1

1

正确的。在 C apache 模块中,您可以添加如下检查:

/* r is the 'request_rec' object from apache */
if (r->connection->aborted) {
    /* stop processing and return */
}

验证客户端是否仍然连接。可能python接口有类似的东西。

至于环回连接,它是一个到 postgresql 数据库的连接,只要该循环正在运行,它就会保持打开状态。

于 2009-11-09T23:51:35.113 回答