被遗弃的Apache进程,会持续多久?
假设有一个服务器程序运行得特别慢,客户端就会抱怨说“超时了”。
如果我没理解错的话,这个超时可能和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数据库的连接,这个连接会保持打开状态,只要这个循环在运行。