Назад | Перейти на главную страницу

Varnish медленно запускается с большой ACL

У меня есть файл конфигурации лака, который выглядит так:

 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 параметр.