在没有开启长连接时,客户端每请求一个资源都需重新建立一次TCP连接,而使用了长连接后,客户端只需在最初请求一次TCP连接,之后就可以使用同一个TCP连接发送其他的http请求。长连接的状态是指在服务端处理完某一个请求后,它立即进入长连接状态以保持TCP连接不断开,等待客户端再次发送请求。
但长连接自身的缺陷是会一直占用着连接不释放,所以必须得给出一个长连接的超时时间。这个超时时间由KeepAliveTimeout指令控制,进入长连接后如果在此时间间隔内客户端还没有发送新请求,则TCP连接自动断开。如果在长连接状态下,客户端再次发送了请求,则服务端处理请求,并在处理完请求后又再次进入长连接状态并计算KeepAliveTimeout。
此外,还可以通过指令MaxKeepAliveRequests控制每个长连接下的TCP连接的能接受的最大请求数。无疑,这个值应该设置的大一些,设置为0表示无限制。这个指令是从数量的角度控制长连接的TCP应该何时断开。例如,在长连接超时时间内接受同一个客户端的500个请求才断开,然后该客户端再有新的请求只能重新建立TCP连接。
MaxKeepAliveRequests 500 1.3 容器类指令路径和条件判断容器包括:
< Directory >、< DirectoryMatch >
< Files >、< FilesMatch >
< Location >、< LocationMatch >
< IfModule >
< IfDefine >
< IfVersion >
< if >
< elseif >
< else >
1.3.1 容器< Directory >和< Files >还包括它们的正则匹配容器< DirectoryMatch >、< FilesMatch >。
< Directory >容器的作用是"对于匹配到的目录,封装一组指令,这些指令只作用于该目录以及它的子目录中的文件"。注意,< Directory >容器通常都是用绝对路径,即< Directory /PATH/to/DIR >,如果使用相对路径,则它相对于根文件系统的"/"。例如< directory newdir >等价于< directory /newdir >。
例如:
<Directory "/"> AllowOverride none require all denied </Directory> <Directory "/usr/local/apache/htdocs"> require all granted </Directory>第一个容器表示拒绝所有对"/"下内容的访问,包括子目录中的文件,这个根是根文件系统的根,而不是ServerRoot。而第二个容器则表示允许/usr/local/apache/htdocs目录下文件的访问。
由此可以想象得出,出于安全考虑,应该总是先将父目录进行限制,再在需要放宽权限的子目录中指定特定的权限。正如上面的设置,将最顶级目录"/"完全限制,然后在小范围的htdocs目录中放行。
再看< Files >容器,它针对的是某个或某些特定的能被匹配上的文件。它匹配的范围是它所在的上下文。
例如,下面的指令如果写在server上下文,那么将对任意private.html文件拒绝。
<Files private.html> require all denied </Files>而如果将其写在< directory >容器中,则只对该目录容器中的所有private.html生效。由于< directory >会递归到子目录中,所以子目录中的private.html也会拒绝,但非private.html将被允许。
<Directory "/usr/local/apache/htdocs"> require all granted <Files private.html> require all denied </Files> </Directory>< directory >和< files >容器可以使用通配符,"*"表示任意字符,"?"表示任意单个字符,"[]"表示范围,如[a-z]、[0-9],但是这些通配符都不能匹配"/"。所以要跨目录匹配时,必须显式指定各个目录的"/"符号。
例如,<directory /*/public.html>无法匹配/home/user/public.html,但directory /home/*/public.html可以匹配。
它还可以使用正则表达式匹配,只需使用一个"~"符号即可。这时和使用< DirectoryMatch >、< FilesMatch >是一样的,只不过Match类指令不需要使用"~"符号。
例如,下面的设置。其中后两个Directory容器是等价的。
# 匹配不区分大小写的gif/jpg/jpeg/png <FilesMatch "\.(?i:gif|jpe?g|png)$"> Require all denied </FilesMatch> <Directory ~ "^/usr/local/apache/htdocs/[0-9]{3}"> DirectoryIndex digest.html </Directory> <DirectoryMatch "^/usr/local/apache/htdocs/[0-9]{3}"> DirectoryIndex digest.html </DirectoryMatch>