好多人问transmit的封禁策略,看了一下代码,讲解一下:
transmit.conf中有像这样的几个配置项,比如:
#连接阀值 CONN_CHECK_PERIOD_0 : 30 CONN_STAY_PERIOD_0 : 590 CONN_THRESHOLD_0 : 20 #IP阀值 IP_CHECK_PERIOD_0 : 30 IP_STAY_PERIOD_0 : 590 IP_THRESHOLD_0 : 64 IP_CHECK_PERIOD_1 : 600 IP_STAY_PERIOD_1 : 590 IP_THRESHOLD_1 : 300 #cookie阀值 COOKIE_CHECK_PERIOD_0 : 30 COOKIE_STAY_PERIOD_0 : 590 COOKIE_THRESHOLD_0 : 60
transmit支持3种类型的判断封禁,连接(CONN),IP,COOKIE其中CONN和IP都是以用户的IP包头中的IP来进行判断的。 COOKIE是HTTP包内的cookie的值来进行判断的。
一.CONN会在accept成功的时候(用户连接的时候)把用户的ip对应的计数器加1 --注意:KEEPALIVE的用户不会重复连接
二.IP会在
1.accept成功的时候
2.读取用户信息的HTTP包头的时候
把用户ip对应的累加器加1
三.COOKIE会在读取用户HTTP包头的时候把用户的cookie对应的计数器加1 --注意:只要cookie一样都会被累加
于是可以这么理解:
CONN计数器会为每一个ip分一个计数器,在有用户新建立连接的时候加一
IP计数器会为每一个ip分一个计数器,在有用户数据包到的时候加一
COOKIE计数器会为每一个COOKIE值分配一个计数器,在有相同的COOKIE值的时候加一
CHECK_PERIOD,STAY_PERIOD,THRESHOLD三者的意义:
CHECK_PERIOD为检测的间隔,如果用户在这个时间内没有请求,就会清除用户的请 求记录。
STAY_PERIOD为当需要封禁用户时候,封禁的时间。
THRESHOLD为阈值,如果次数在CHECK_PERIOD时间内超过这个阈值,就把它放到 PRISON中。
每一种类型CONN,IP,COOKIE可以支持配置多个监测点(总共最多5个,不然会对效率产生影响)比如上面的例子IP配了两个。每一个IP来的时候,会分别对这两个阈值进行判断, 如果一个满足封禁要求,就把它放到PRISON中。
这样是为了: 有些用机器抓取我们的页面,一个短时间内不会超过阈值,但是很长时间内会有持续的较大量的连接,用户一般来说不可能有这样的行为。 这样我们第二个配置就可以生效。
个人认为第一个配置是为了防止攻击的(短时间内大量的请求),第二个是为了防止有机器抓取的(长时间内的较大量的请求)。
transmit可以配好多种apache,有如下的配置项:
#MAIN_APACHE LOCAL_APACHE : localhost:8090 #BWS BWS_DIR : /s? /sina? /index.php? /? BWS_PAGE : / /index.php /index.html /index.htm BWS : localhost:8200 #PP_APACHE PP_APACHE_DIR : /sina.php? /cpro.php? /conads.php? /live.php? PP_APACHE0 : tc-news-vi00.tc:8080 PP_APACHE1 : tc-news-vi01.tc:8080 #COOKIE_APACHE COOKIE_APACHE0:10.23.11.11 8080 cookiefile.1 COOKIE_APACHE0:10.23.11.12 8080 cookiefile.2 COOKIE_APACHE0:10.23.11.13 8080 cookiefile.3 DISPATCH_SCALE : 0 #DISPATCH_APACHE DISPATCH_APACHE : 10.23.12.32:8080 RECOVER_TIME : 30
其中LOCAL_APACHE是主apache
BWS是次要的apache,可以支持对请求路径和页面的分流(BWS_DIR,BWS_PAGE)
PP_APACHE是轮训的APACHE(也支持PP_DIR根据请求串分流)
COOKIE_APACHE是根据用户请求的COOKIE值分流的apache。COOKIE_APACHE配置的第三项要指定cookiefile,里面有一些cookie值,如果用户请求中的cookie匹配这个apache的cookiefile的某一项,那么就能落在这个apache上。
DISPATCH_APACHE是根据用户的IP分流的apache。
recover_time是一旦发现哪个apache挂了,在这段时间内不再会连接这个apache,
recover_time时间后会重试。
以下是一个请求(注意:不是一次连接,KEEPALIVE的每一次请求都会选择一个apache)进来选择apache的策略(逻辑较复杂):
如果配置了BWS_DIR或者是BWS_PAGE:用户的请求匹配到这个DIR或是PAGE,(比如用户请求www.sina.com/s?word=sina就匹配上面的配置):
如果配置了COOKIE_APACHE,并且用户请求的的COOKIE值匹配某一个cookie_apache的cookiefile中的值,就选择这个 cookie_apache.
如果没有配置COOKIE_APACHE或者没有匹配任何的cookie_file:
如果用户配置了DISPATCH_APACHE并且符合DISPATCH_SCALE的比例,就选择dispatch_apache.
既没有配置cookie_apache和dispache_apache就选择BWS。
如果用户指定的PP_DIR:用户的请求的DIR符合PP_APACHE_DIR的就被选择到了这个PP_APACHE,轮训选择PP_APACHE中的一个APACHE。
如果没有BWS_DIR,BWS_PAGE,PP_APACHE_DIR或者不匹配上面条件中的任何一个,就选择LOCAL_APACHE.
所以,基本的功能可以这样理解:
如果只需要连接一个APACHE,配置LOCAL_APACHE即可
如果需要根据用户的IP分流,可以指定BWS_DIR或者BWS_PAGE(配置本服务支持的所有的DIR或PAGE),DISPATCH_SCALE (默认为0),DISPATCH_APACHE,BWS
如果需要根据用户的COOKIE分流,可以指定BWS_DIR或者BWS_PAGE(配置本服务支 持的所有的DIR或PAGE),COOKIE_APACHEn (需要指定cookie file), BWS
如果需要轮训apache,可以指定PP_APACHE_DIR / (表示所有请求), 若干个PP_APACHEn,一个LOCAL_APACHE(万一前面的PP_APACHE都不行了,这个自动为备用)
如果既需要根据用户的DIR分流,可以配合BWS_DIR,BWS 和 PP_APACHE_DIR PP_APACHEn 和LOCAL_APACHE(如果都不匹配,选择这个apache)。