Apache Timeout,apachetimeout
Apache Timeout,apachetimeout
timeout官方解析http://httpd.apache.org/docs/2.2/mod/core.html#timeout
我的理解是这个超时参数只是前后两次tcp传输包的间隔,如果大于这个间隔,apache就主动关闭tcp连接.
(中文文档翻译有出入,被坑爹了)
-------------------------------------------------------------------------
httpd.conf设置:
Timeout 10
(1)测试原理:写个脚本与apache三次握手建立tcp连接之后,发送一个不完整的http GET请求,也就是最后的一个"\r\n"不传送,然后每隔5秒发送一个垃圾包.
测试结果:该apache线程一直被这个连接hold住,在大致过了2分钟才返回400错误(Size of a request header field exceeds server limit),断开tcp连接.
注意:这儿返回400是 LimitRequestFieldSize 这个参数的作用,这个参数默认为 8k,表示最多能接收的request header的大小,因为我一直在发垃圾包,所以最终导致request header大于了这个默认值,apache返回了400.(这儿的响应时间跟包的流量有关)
(2)测试方法同(1),不过间隔时间改为 15s 发送一个包,大于timetout的设置.
测试结果:该apache线程10s后就返回了400错误,断开tcp连接. 响应时间与设置的timeout值相同.
结论:
(1)timeout并不是接受一个GET请求耗费的总时间,而只是指两个tcp包之间的超时时间.
(2)如果客户端以小于timeout的时间间隔一直发错误包,这个apache线程将被一直hold住,直到LimitRequestFieldSize所指大小. 测试代码
-
#!/usr/bin/perl -w
-
use strict;
-
use Socket;
-
use IO::Handle;
-
use threads;
-
sub connect {
-
my $host = '172.23.181.160';
-
my $port = '80';
-
my $protocol = getprotobyname('TCP');
-
$host = inet_aton($host);
-
socket(SOCK, AF_INET, SOCK_STREAM, $protocol) or
die ;
-
my $dest_addr = sockaddr_in($port, $host);
-
connect(SOCK, $dest_addr) or die;
-
SOCK->autoflush(1);
-
# print SOCK "POST /member/login.jhtml HTTP/1.1\r\nHost:login.taobao.com\r\nContent-Length: 100\r\n\r\n";
-
print SOCK "GET /member/login.jhtml HTTP/1.1\r\nHost:login.taobao.com\r\n";
-
while (1) {
-
print SOCK "hello world!";
-
sleep(5);
-
}
-
close SOCK;
-
}
-
my $child = 0;
-
for ( my $i = 0; $i< 1; $i++) {
-
$child = threads->new(\&connect);
-
}
- $child->join;
评论暂时关闭