被遗弃的Apache进程,会持续多久?

0 投票
1 回答
1259 浏览
提问于 2025-04-15 15:50

假设有一个服务器程序运行得特别慢,客户端就会抱怨说“超时了”。

如果我没理解错的话,这个超时可能和Apache的超时设置有关,但不一定是这样。我这么认为是因为在测试相关页面时,我们并没有可靠地遇到超时的情况——大多数时候,浏览器只是一直在转圈,直到完成。

超时设置会在与客户端的连接出现问题时生效,具体可以参考文档。但如果连接正常,那就得看客户端是否主动关闭连接(我认为是这样的)。

我还以为这意味着如果客户端关闭了浏览器,Apache会达到超时限制(在我的例子中是300秒),然后终止这个进程。但看起来并不是这样。

这是我测试的方式:
我在服务器的代码中添加了一个循环:

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命令没有任何输出,而临时文件则被循环的输出填满了。

所以看起来Apache进程只是按照要求执行,无论客户端的连接状态如何?那这个回环连接又是怎么回事呢?

1 个回答

1

没错。在一个C语言写的Apache模块里,你可以加一个检查,比如:

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

来确认客户端是否仍然连接着。可能Python的接口也有类似的功能。

至于回环连接,它是指一个与PostgreSQL数据库的连接,这个连接会保持打开状态,只要这个循环在运行。

撰写回答