squid и два cache_peer'а
Вчера сделал любопытную схему руления контентом на базе 3х различных прокси. Суть такова:
.-> [privoxy] -->.
<users> -> [squid] -> { } --> <site>
'-> [polipo] -->'
По верхнему маршруту пускается весь html, js, etc., короче всё, где может быть реклама. По нижнему - весь тяжёлый контент: бинарники, архивы, и прочая мультимедия.
Для polipo специально написал 2 патча - первый реализует группировку хостов на уровне кэша, второй - позволяет набигать на этот самый кэш и грабить нужные файлы.
Конфиг squid'а в части, относящеёся к теме:
acl hard-caching-types urlpath_regex -i \.zip$
acl hard-caching-types urlpath_regex -i \.rar$
acl hard-caching-types urlpath_regex -i \.tar$
acl hard-caching-types urlpath_regex -i \.tar.(bz2|gz|xz)$
acl hard-caching-hosts dstdom_regex -i \.c\.youtube\.com
acl hard-caching-hosts dstdom_regex -i download[0-9]*\.avast\.com
acl hard-caching-hosts dstdom_regex -i um[0-9]*.eset.com
# на самом деле таких правил там много, выложил для примера
cache_peer 127.0.0.1 parent 8118 0 no-query no-netdb-exchange no-digest name=privoxy
cache_peer 127.0.0.2 parent 8118 0 no-query no-netdb-exchange no-digest name=polipo
cache_peer_access privoxy deny hard-caching-types
cache_peer_access privoxy deny hard-caching-hosts
cache_peer_access privoxy allow all
cache_peer_access polipo allow hard-caching-types
cache_peer_access polipo allow hard-caching-hosts
cache_peer_access polipo deny all
По поводу cache_peer_access
я очень долго бодался со сквидом, чтобы он наконец понял, что я от него хочу. После 2х часов курения документации, нашёл ответ буквально в одной фразе: «acl'ы между собой OR'ятся, access'ы - AND'ятся», Например следующие настройки:
cache_peer_access privoxy deny hard-caching-types hard-caching-hosts
cache_peer_access privoxy allow all
запретят доступ через privoxy для hard-caching-types только на хостах из hard-caching-hosts.
Первоначально была идея сделать всё через «Content-Type:», но это нереализуемо, т.к. в этом случае мы должны как-то угадать тип ответа перед, собственно, запросом, т.е. до принятия решения через какой parent мы будем отправлять запрос.
Настройки группировки хостов в polipo:
# | куда | что
cache.youtube.com: .*cache[0-9]*.c.youtube.com
cache.youtube.com: .*nonxt[0-9]*.c.youtube.com
download.avast.com: download[0-9]*.avast.com
updates.eset.com: um[0-9]*.eset.com
P.S. Можно грабить корованы...