У меня есть очень простой скрипт на 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 минут ожидания.