光油开始时ACL很大

我有一个清configuration文件,看起来像这样:

backend web1 { .host = "1.2.3.1" ; ... } backend web2 { .host = "1.2.3.2" ; ... } backend web3 { .host = "1.2.3.3" ; ... } backend web4 { .host = "1.2.3.4" ; ... } director default_director round-robin { { .backend = web1; } { .backend = web2; } { .backend = web3; } { .backend = web4; } } include "blacklist.vcl"; sub vcl_recv { if (client.ip ~ blacklist ) { error 403 "You're blacklisted"; } .. } 

黑名单条目显然是由我不想访问我的服务器的网站组成的。

不幸的是,我的黑名单文件很大,在每周/星期内变大:

  $ wc -l varnish/blacklist.vcl 6664 varnish/blacklist.vcl 

我已经从阻止/ 32s切换到阻止/ 24s减less名单,但我仍然发现,我不能在不到5秒钟重新启动清漆。

还有什么我可以做的加载黑名单? 我意识到我可以使用iptables,但是对于这样一个大型的项目来说也很慢 – 因为我必须把它们全部抹掉,并在有任何变化时重新加载它们。

如果您只想解决重启Varnish所需的时间,这可能不是您要查找的内容 – 但对于重新加载configuration,我为您提供以下解决scheme;

清漆configuration转换为C源代码,并加载时编译。 所以加载configuration所需的时间包括编译时间。 这很可能是导致你长时间等待的原因。

您可以使用varnishadmin加载一个新的configuration,如下所示:

 # varnishadm vcl.load my_alias_2013-04-13 /etc/varnish/config.vcl vcl.use my_alias_2013-04-13 

如果VCL在语法上有错误,上述内容也会产生非常有用的debugging信息。 它不会清除您的caching,也不会中断服务。 vcl.use基本上加载了一个内置的.so文件,并在内存中改变了一些指针,使得在运行时非常容易,无需重启整个服务。

Varnish对此特别不好,它生成的C代码实际上是一个线性search – 就像向iptables添加单独的规则一样糟糕。

但是,你可以使用iptables,并使其快速。

改用ipset 。 IPSets是ips的快速哈希查找,在大量地址中查找IP非常快速。

使用以下命令创build一个ipset:

 ipset create myset hash:ip 

这将生成您放置地址的集合。

接下来,将您的ips添加到设置中。

 ipset add myset 1.1.1.1 ipset add myset 1.1.1.2 ipset add myset 1.1.1.3 ipset add myset 1.1.1.4 ... 

最后,向IPtables添加一个规则来使用这个集合来执行匹配。

 iptables -N VARNISH_BL iptables -I VARNISH_BL -m set --match-set myset src -j REJECT iptables -I INPUT -m tcp -p tcp --dport 80 -m conntrack --ctstate NEW -j VARNISH_BL iptables -I INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 

您可以转储该集合以便稍后重新初始化(例如重新启动后),使用ipset save myset打印到标准输出。 你当然也可以使用ipset add在任何时候添加更多的IP到这个集合。

你也可能真的希望你的IP黑名单自动失效。 ipset也可以通过指定在创build时添加到集合的任何IP的缺省超时值来执行此操作: ipset create myset hash:net timeout 86400

默认情况下最多允许一个集合中的65535个主机,但是检查手册页,可以使用maxelem参数创build更大的集合。