当请求的内容长度超过实际内容长度时,Http连接冻结

时间:2011-04-01 12:16:15

标签: python apache http sockets tcp

我有一个非常基本的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 Bad Request。

我对生产网站进行了尝试,显然我立即做出了回应。

有人可以解释TCP级别上发生了什么,以及我缺少什么apache配置 - 我想摆脱这样的5分钟等待。

1 个答案:

答案 0 :(得分:1)

好的,它是apache conf中的Timeout指令。 http://httpd.apache.org/docs/2.2/mod/core.html#timeout