У меня есть файл конфигурации лака, который выглядит так:
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
Я переключился с блокировки / 32 на блокировку / 24 секунды, чтобы сократить список, но я все еще обнаружил, что не могу перезапустить лак менее чем за 5 секунд.
Есть ли еще что-нибудь, что я могу сделать, чтобы загрузить черный список? Я понимаю, что могу использовать iptables, но это тоже медленно для такой большой записи - так как мне нужно стереть их все и перезагрузить, когда есть какие-либо изменения.
Возможно, это не то, что вы ищете, если вы хотите рассчитать время, необходимое для перезапуска Varnish, но для перезагрузки конфигурации у меня есть следующее решение для вас;
Конфигурация Varnish преобразуется в исходный код C и компилируется при загрузке. Таким образом, время, необходимое для загрузки конфигурации, включает время компиляции. Скорее всего, именно поэтому вам пришлось долго ждать.
Вы можете использовать varnishadmin для загрузки новой конфигурации, например:
# varnishadm
vcl.load my_alias_2013-04-13 /etc/varnish/config.vcl
vcl.use my_alias_2013-04-13
Вышеупомянутое также даст очень полезную информацию об отладке, если что-то синтаксически неправильно с VCL. Это не очистит ваш кеш и не прервет работу службы. vcl.use в основном загружает встроенный .so-файл и изменяет некоторые указатели в памяти, что упрощает выполнение этой задачи во время выполнения без перезапуска всей службы.
Varnish с этим особенно плохо справляется, код C, который он для этого генерирует, по сути является линейным поиском - так же плохо, как добавление отдельных правил в iptables.
Но ты жестяная банка используйте iptables и сделайте это быстро.
Использовать ipset вместо. IPSets - это быстрый поиск IP-адресов по хешу, это очень быстро для поиска IP-адресов в большом количестве адресов.
Создайте 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
который выводится на стандартный вывод. Вы также можете в любое время добавить в набор дополнительные IP-адреса, используя ipset add
.
Также вы можете захотеть, чтобы ваш черный список IP-адресов автоматически истекал. ipset
это тоже можно сделать, указав тайм-аут по умолчанию для любого IP-адреса, добавленного в набор во время создания, с помощью: ipset create myset hash:net timeout 86400
По умолчанию разрешено до 65535 хостов в одном наборе, но проверьте страницу руководства, вы можете создавать большие наборы, используя maxelem
параметр.