当请求的内容长度超过实际内容长度时,Http连接会冻结
我有一个非常简单的Python脚本,用来进行HTTP连接。
import socket
def main():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = "192.168.56.21"
s.connect((host, 80))
msg = """GET /lol /HTTP1.1
Content-Length: 10
%s""" % ("*" * 9)
s.send(msg)
print msg
print s.recv(1000)
if __name__ == "__main__":
main()
你可以看到,Content-Length这个头信息的值比实际内容的长度要大。当我运行这个脚本时,它会卡住5分钟,之后我在Apache的日志中看到请求执行了5分钟,并且得到了HTTP 400的响应。
192.168.56.21 - - [01/Apr/2011:15:07:52 +0300] "GET /lol /HTTP1.1" 400 358 "-" "-" 47 531 300011809
我对此没意见,但我不明白的是,为什么Apache会在这5分钟内一直保持连接不关闭。
apache2 3947 www-data 19u IPv6 17165 TCP 192.168.56.21:www->192.168.56.21:53112 (ESTABLISHED)
python2.6 4636 meuser 3u IPv4 17164 TCP 192.168.56.21:53112->192.168.56.21:www (ESTABLISHED)
我猜Apache是在等Content-Length中指定的字节数,直到超时发生,然后才返回400错误请求。
我在生产环境的网站上试过,明显是立刻就得到了响应。
有没有人能解释一下在TCP层面上发生了什么,以及我在Apache配置上缺少了什么——我想要避免这种5分钟的等待。
1 个回答
1
好的,这里说的是Apache配置中的超时指令。你可以在这个链接找到更多信息:http://httpd.apache.org/docs/2.2/mod/core.html#timeout