main

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. Можно грабить корованы...