为什么我通过urllib2发出的请求在Apache2中被延迟?

2 投票
1 回答
601 浏览
提问于 2025-04-17 03:21

我正在处理两个内部网页服务器,一个是在Ubuntu Server 10.04上运行的Apache2,另一个是在Windows Server 2008上运行的IIS。当我在浏览器中清空缓存后,直接输入服务器的IP地址访问这两个服务器的根网址时,它们都能迅速弹出来,没有任何延迟。而且在这两个服务器上浏览网站时也没有感觉到延迟。不过,当我用Python中的urllib2去访问同样的地址时,每次请求Apache2服务器都要等4.5到5秒,而IIS服务器的响应时间不到0.02秒。

这是我用来验证问题的一个脚本。我设置了用户代理(User-Agent),看看是否会有影响,但似乎没有:

import urllib2
from time import time

apache_server = 'http://192.168.1.101/'
iis_server = 'http://192.168.1.102/'

headers = {'User-Agent' : "Mozilla/5.0 (X11; U; Linux i586; de; rv:5.0) Gecko/20100101 Firefox/5.0",}

print('Contacting Apache2 server...')
request = urllib2.Request(url=apache_server, headers=headers)
start = time()
response = urllib2.urlopen(request).read()
elapsed = time() - start
print('Elapsed time: {0}'.format(elapsed))

print('Contacting IIS server...')
request = urllib2.Request(url=iis_server, headers=headers)
start = time()
response = urllib2.urlopen(request).read()
elapsed = time() - start
print('Elapsed time: {0}'.format(elapsed))

结果:

>python urltest.py
Contacting Apache2 server...
Elapsed time: 4.55500006676

Contacting IIS server...
Elapsed time: 0.0159997940063

浏览器请求和我的urllib2请求之间有什么区别,能解释这个延迟吗?

我见过类似的问题,像SSH连接时因为反向DNS查找导致的延迟,但我在Apache2的配置中设置了HostnameLookups Off。我不知道还有什么其他原因会触发查找。


更新:我用Wireshark跟踪了这个过程,发现从我的机器到Apache2服务器之间有三个失败的NBNS查询,才开始正常通信。这就是造成延迟的原因。我尝试在hosts文件中为网页服务器添加一个条目,这样就消除了延迟。

我不想把这个当作答案,因为我仍然不知道为什么会发生查找尝试,或者为什么在浏览器中没有看到同样的情况。我只是找到了一个解决我犯的错误的临时办法。

1 个回答

0

这个查找过程是因为Windows系统的工作方式。它总是会先检查NetBIOS,然后才会去做其他的事情。

想了解更多,可以看看:

撰写回答