div.main {margin-left: 20pt; margin-right: 20pt}Bog BOS: Squid (кеширующий прокси для http): установка, настройка и
использование
Представляет собой HTTP, FTP, gopher, SSL и WAIS proxy, кеширующий запросы.
Также кеширует DNS. Один процесс на всех, неблокированный ввод/вывод, держит
часто используемые объекты в виртуальной памяти. Бесплатен (GPL) в исходниках. Поддерживает иерархию
серверов (ICP/UDP, HTCP/TCP, multicast). Откуда брать объект определяется так (в
упрощенном виде): послать ICP/HTCP/multicast запросы ко всем подходящим соседям;
подождать определенное время; загрузить с первого соседа, пославшего HIT; иначе
загрузить с первого отца, ответившего MISS; иначе загрузить с первоисточника.
Делается различие между частными и общими объектами. Только общие
объекты кешируются. Только метод GET дает общие объекты. Объекты, попавшие в
стоп-лист есть частные объекты. Если запрос содержит аутентификационную
информацию или ответ типа "401 Unauthorized" - это частный объект. Подробнее здесь.
cache digest - очень компактная форма представления какие объекты
имеются в кеше. Кеши могут обмениваться этой информацией с соседями, чтобы
избежать необходимости делать ICP-запросы. В качестве ключей объектов
используется MD5.
Текущая стабильная версия: Squid 2.3-STABLE4 (18 июля 2000;
отличия 2.3 от 2.2).
Готовится к выходу 2.4 (отличия 2.4 от 2.3).
Squid 2.3-STABLE4,
Linux RedHat 7.0 (два сервера: распасовщик и антибаннер) Squid 2.3-STABLE2,
Linux RedHat 6.2 (transparent proxy) Squid 2.3-STABLE1,
Linux RedHat 6.0 (распасовочный) Squid
2.2-STABLE4, Linux RedHat 6.0, из rpm Squid
2.2-STABLE2, Solaris 2.5, Sparc
--prefix=/usr/local/squid (куда инсталлировать архитектурно-независимые
файлы, по умолчанию /usr/local/squid)
--enable-carp (Enable CARP support, cache ... routing protocol)
--enable-async-io=число (гм.. в Linux?)
--enable-icmp (измерять путь до каждого HTTP-сервера при запросах с
помощью ICMP)
--enable-delay-pools (управление ограничением
трафика)
--enable-useragent-log (журнализовать заголовок Useragent
--disable-wccp (Disable Web Cache Coordination Protocol)
--enable-kill-parent-hack (помогает сделать shutdown чисто)
--enable-snmp (Enable SNMP monitoring)
--enable-time-hack (Update internal timestamp only once per second)
--enable-arp-acl (ether address ACL)
--enable-cachemgr-hostname=имя-хоста (cachemgr.cgi будет по
умолчанию натравлен на этот хост)
--enable-htcp (HTCP - вариант ICP по TCP)
--enable-forw-via-db (Enable Forw/Via database)
--enable-cache-digests (Use Cache Digests)
--enable-err-language=язык
--enable-gnuregex (вместо regex, плохо работающего в Linux)
--enable-poll (можно использовать poll или select; poll быстрее, но не на
всех платформах работает; обычно выбор делается автоматически, но если Вы
умнее configure...)
--disable-poll
--disable-http-violations (игнорировать все строки в конфигурации, которые
нарушают стандарты HTTP)
--enable-ipf-transparent (разрешить поддержку transparent proxy для
систем, использующих IP-Filter - в Linux и без этого хорошо)
--disable-ident-lookups
--disable-internal-dns (This prevents Squid from directly sending and
receiving DNS messages, and instead enables the old external 'dnsserver'
processes)
--enable-truncate (обнулять файлы вместо их удаления: быстрее, но требует
много inode; были проблемы, когда переполнялась таблица inode; наверное,
параметр minimum_object_size из-за этого появился)
--enable-underscores (позволять подчеркивания в именах хостов, надеясь что
резолвер их не обрежет)
--enable-heap-replacement (использовать улучшенные алгоритмы замещения кеша
вместо стандартного LRU)
--enable-dlmalloc (своя библиотека malloc, не быстрая но без memore leak)
--enable-splaytree (ускорение обработки ACL)
-a (порт для входных HTTP запросов)
-d (отладка на stderr)
-f имя-файла-конфигурации
-h (help)
-k
reconfigure (посылка сигнала HUP)
rotate (rotate журналы; USR1)
shutdown (TERM)
interrupt (shutdown без паузы; INT)
kill (даже не закрыв журналы; KILL)
debug (начать/закончить полную трассировку; USR2)
check (ZERO)
-s (level 0 debugging to syslog в дополнение к файлу)
-u (порт для входных ICP запросов)
-v (напечатать версию)
-z (создать дисковый кеш при первом запуске)
-D (не делать DNS-тест при запуске)
-F (восстановление после сбоя не в фоновом режиме)
-N (не становиться фоновым процессом)
-V (поддержка виртуальных хостов для режима акселерации - аналогично
"httpd_accel_host virtual" в конфигурационном файле)
-X (включить отладку при разборе конфигурационного файла)
-Y (более быстрое восстановление после сбоев)
сетевые параметры
http_port 3128 (порт для запросов клиентов); в версии 2.3
можно указывать перед портом имя хоста или IP-адрес
icp_port 3130 (если соседей не ожидается, то поставить
"icp_port 0")
htcp_port 4827 (порт для общения с соседями - ICP - через
TCP, нужен "--enable-htcp" в configure )
mcast_groups 239.128.16.128 224.0.1.20 (к каким
multicast группам подсоединяться для получения ICP, есл используется
multicast; не трогать)
tcp_incoming_address 0.0.0.0 (по какому адресу принимать
входные пакеты, если хост имеет несколько интерфейсов); в 2.3 убран
tcp_outgoing_address 0.0.0.0 (при посылке ставить
указанный адрес в качестве исходного)
udp_incoming_address 0.0.0.0 (аналогично, для ICP)
udp_outgoing_address 0.0.0.0 (аналогично, для ICP)
passive_ftp on | off (по умолчанию включен, но если squid за
firewall, то надо выключить (будет использоваться PORT); введен в
2.3-STABLE3)
соседи (neighbour, peer)
cache_peer hostname type proxy-port icp-port
options (каждый сосед описывается отдельной строкой)
type
parent - старший в иерархии (если запрос отсутствует в
локальном кеше, то он направляется к parent, тот - при отсутствии в
своем кеше - пересылает запрос дальше и возвращает готовый ответ
подчиненному в иерархии; если squid получает от parent TCP_DENIED, то он
лезет напрямую)
sibling - одного уровня (если запрос отсутствует в локальном
кеше, то он направляется к sibling, тот - при отсутствии в своем кеше -
сразу возвращает сообщение об этом, ничего не предпринимая)
multicast
options
proxy-only (объекты, взятые с этого узла не хранить у себя)
weight=число (число от 1, по умолчанию - 1, чем больше
тем больше приоритет при прочих равных)
ttl=число (TTL в посылаемых ICP пакетах при
использовании multicast)
no-query (не посылать ICP запросы - только принимать)
default (самый старший в иерархии, используемый как
last-resort)
round-robin (определяет множество старших кешей, используемых
по очереди)
multicast-responder (данный сосе является членом multicast
группы, запрос к не посылается через multicast, но запросы от него будут
обрабатываться и так)
closest-only (при ответах ICP_OP_MISS не передавать
FIRST_PARENT_MISS)
no-digest (не запрашивать от этого соседа cash-digest)
no-netdb-exchange (не запрашивать у этого соседа ICMP RTT -
round trip time - NetDB)
no-delay (при перегрузке delay pool не
лезть к этому соседу)
login=user:password (если старший в иерархии
proxy требует аутентификации)
connect-timeout=
digest-url=
cache_peer_domain host domain
[domain...] ограничить запросы к данному соседу данным
списком доменов (можно использовать отрицание с помощью восклицательного
знака)
neighbor_type_domain parent | sibling
domain... модифицировать тип соседа при запросах к данному
домену
icp_query_timeout milisec (по умолчанию определяется
автоматически для каждого соседа)
maximum_icp_query_timeout milisec
mcast_icp_query_timeout milisec (по умолчанию 2000 ms,
ожидание ответа на регулярные multicast опросы)
dead_peer_timeout 10 seconds (как долго ждать прежде, чем
объявить соседа "мертвым")
hierarchy_stoplist (список строк - через пробел, - при встрече
которых в URL, запрос будет направлен сразу напрямую, а не "по соседям";
по-умолчанию - cgi-bin вопросительный знак)
no_cache deny имя-ACL (определяет список объектов, которые
не будут кешироваться; по-умолчанию, кешируется все, хотя рекомендуется
определить "acl QUERY urlpath_regex cgi-bin ?" запретить его
кеширование "no_cache deny QUERY"; на самом деле cgi-bin и query
все-таки кешируются, хотя и слабо)
размер кеша
cache_mem 8 MB (объем оперативной памяти, используемой для
хранения обрабатываемых объектов; если требуется, то этот лимит может быть
слегка превышен; если осталось свободное место, то оно используется для
хранения наиболее часто используемых объектов отрицательных ответов; память
используется и под другие нужды - индекс объектов - на каждый объект
требуется около 100 байт ОП; если средний размер объекта 9КБ (в очень старом
руководстве говорится - 20КБ, в более новом - 13КБ, у меня - 9КБ, как
измельчал интернет!), то на 8ГБ диска понадобится 100МБ ОП только под
индекс объектов; еще понадобится память под кеш IP-адресов, fqdn-кеш и др.)
cache_swap_high 95 (при достижении данного уровня
заполнения кеша - в процентах - начинается ускоренный процесс удаления старых объектов;
для большого кеша эти границы надо поднять, 5% от 8 GB - это 400 MB!)
cache_swap_low 90 (процесс удаления старых объектов
заканчивается, если достигнут данный уровень)
maximum_object_size 4096 KB (максимальный размер
кешируемого объекта; если его увеличишь, то съэкономишь трафик, если
уменьшишь, то странички быстрее грузиться будут - хотя можно просто
увеличить размер кеша; максимальный размер объекта, который удалось за раз
скачать по модему - 8 MB)
minimum_object_size 0 KB (файлы меньшего размера не
сохраняются; введено в 2.3-STABLE3
ipcache_size 1024 (размер кеша для IP адресов - при
наличии nscd это не актуально)
ipcache_high 95 и ipcache_low 90 (верхний и
нижний уровень заполнения IP кеша для алгоритма удаления старых объектов по
LRU)
fqdncache_size 1024 (размер кеша fqdn - полных доменных
имен)
имена и размеры файлов
cache_dir тип Directory-Name Mbytes Level-1
Level2 (определяет имя, размер количество поддиректорий на первом
и втором уровне кеша на диске - каждый кешируемый объект кладется в
отдельный файл, файлы не сваливаются в одно место, а разносятся в
двухуровневой иерархии директорий; можно иметь несколько директорий под кеш
- особенно полезно иметь их на разных дисках). Эксперимент показал, что при
кэше в 700 МБ используется только 2 директории первого уровня. При
стандартной структуре директорий кеша в него "с комфортом" влезает миллион
объектов, если их больше, то надо увеличить число директорий верхнего
уровня. Тип кеша указывается начиная с версии 2.3: ufs (unix file system),
asyncufs.
cache_access_log /usr/local/squid/logs/access.log
(журнализируется каждый запрос к кешу)
cache_log /usr/local/squid/logs/cache.log (журнал запусков
процессов)
cache_store_log /usr/local/squid/logs/store.log (журнал
записи объектов в дисковый кеш; автор рекомендуют поставить none,
т.к. программ анализа все равно нет, нужен ли?)
cache_swap_log полное-имя-файла (это не журнал, а
оглавление кеша на диске, нет смысла менять)
emulate_httpd_log on|off (эмулировать или нет - по умолчанию -
Common Log Format; лучше использовать родной формат)
mime_table /usr/local/squid/etc/mime.conf (добавить .class, .pl, .map, .ico, .bmp, .js, .css, .cab, .exe,
.mid)
log_mime_hdrs off (в журнал access записываются переданные
полученные HTTP-заголовки - очень интересная информация, но больно длинная)
useragent_log имя-файла (по-умолчанию none; в этот файл
будут записываться строки User-agent из HTTP-заголовков; необходима
компиляция с "--enable-useragent_log")
pid_filename /usr/local/squid/logs/squid.pid (none,
если не нужен)
debug_options раздел,уровень (уровень отладки;
волшебное слово ALL для всех разделов; по умолчанию ALL,1;
уровень от 1 до 9 - наивысший; перечень разделов приведен в
doc/debug-sections.txt)
ident_lookup_access список-ACL (если запрос допускается
ACL, то источник проверяется с помощью ident; по умолчанию
"ident_lookup_access deny all" - по умолчанию ACL с именем all
определяется так, что ему удовлетворяет любой запрос; чтоб запретить
использовать ident совсем, можно компилировать с "--disable-ident")
log_fqdn off (определять и записывать в журнал полные
доменные имена источника запроса, вносит дополнительную задержку в обработку
запроса)
client_netmask 255.255.255.255 (при записи в журнал можно
обнулять некоторые биты IP-адреса, чтоб защитить частную жизнь клиента)
параметры внешних программ
ftp_user email-адрес (будет подставляться вместо пароля
при анонимном доступе к ftp-серверам; по умолчанию - Squid@, что
вызывает проблемы с серверами, которые проверяют синтаксис адреса)
ftp_list_width 32 (ширина листинга ftp) - маловато
cache_dns_program /usr/local/squid/bin/dnsserver
dns_children 5 (число процессов, которые делают DNS lookup
вместо squid - чтобы он не зависал, ожидая результата поиска; 0 - если не
нужен (неработоспособная конфигурация); от 5 до 32, сколько их надо легко
понять, просматривая cache.log; при 300 тыс. запросах в день уже третий
dnsserver имеет нулевую загрузку)
dns_defnames off (дополнять однокомпонентные DNS-имена
доменом по умолчанию перед запросом DNS-сервера)
dns_nameservers список-IP-адресов (будет использоваться
вместо того списка DNS-серверов, который опреден в /etc/resolv.conf; по
умолчанию - none)
unlinkd_program /usr/local/squid/bin/unlinkd (программа,
используемая в параллельном процессе для удаления файлов; не нужна, если
используется async-io)
pinger_program /usr/local/squid/bin/pinger (имя программы,
используемой в параллельном процессе pinger; используется, только, если при
компиляции использовался ключ "--enable-icmp")
redirect_program none (позволяет подключить программу
преобразования URL при каждом запросе; запускается при запуске самого squid
и висит в ожидании очередной строки; см.)
redirect_children 5 (сколько процессов преобразования
запускать параллельно)
redirect_rewrites_host_header on (по умолчанию, Squid
переписывает поле "Host:" в заголовках преобразованных запросов, это не
всегда хорошо)
redirector_access acl (какие запросы направлять через
редиректор; по умолчанию - все)
authenticate_program none (позволяет производить
аутентификацию клиентов, делающих запросы;программа должна в цикле читать
строку "имя пароль" выдавать OK или ERR; должен
быть определен ACL proxy_auth; традиционная программа аутентификация
определена в ../auth_modules/NCSA (надо сказать make; make
install), после чего добавить authenticate_program
/usr/local/squid/bin/ncsa_auth /usr/local/squid/etc/passwd
authenticate_children 5 (сколько параллельных процессов
будут заниматься аутентификацией)
authenticate_ttl 3600 (сколько секунд кешировать
результаты работ программы аутентификации)
authenticate_ip_ttl 0 (чтобы с нескольких мест не
пользовались одним именем)
тонкая настройка кеша
wais_relay_host localhost
wais_relay_port 8000 (куда перенаправлять wais-запросы)
request_size 100 KB (максимально возможный размер запроса;
если клиент загружает файлы с помощью метода POST, то необходимо увеличить
допустимый размер) - убран в версии 2.3
request_header_max_size 10KB (появился в 2.3)
request_body_max_size 1 MB (появился в 2.3)
reply_body_max_size 0 (появился в 2.3)
refresh_pattern [-i] regex MIN_AGE percent
MAX_AGE[options] используется, чтоб определить не
устарел ли объект в кеше. Имя объекта сравнивается по очереди с регулярными
выражениями в строках refresh_pattern до первого совпадения, параметры из
соответствующей строк используются в алгоритме проверки "на свежесть". По
умолчанию, регулярные выражения различают прописные/строчные буквы, чтобы
игнорировать это различие, используется ключ "-i". MIN_AGE и MAX_AGE-
время в минутах (MAX_AGE также используется, если приходится делать запрос к
соседям (Cache-Control: Max-age=nnn) ). procent - целое число. OBJ_DATE -
время извлечения объекта с исходного сервера (заголовок HTTP Date).
OBJ_LASTMOD - время последнего изменения объекта (заголовок HTTP
Last-Modified). OBJ_AGE = NOW - OBJ_DATE (как давно мы его извлекли). LM_AGE
= OBJ_DATE - OBJ_LASTMOD (насколько стар был объект в момент извлечения).
LM_FACTOR = OBJ_AGE / LM_AGE. CLIENT_MAX_AGE - максимальный возраст объекта,
который удовлетворит клиента (HTTP/1.1 Cache-Control: ). EXPIRES - срок
хранения объекта (из ответа сервера, если есть). В общих чертах алгоритм
описан так: если (определен CLIENT_MAX_AGE)
если (OBJ_AGE > CLIENT_MAX_AGE)
то (объект старый)
если (определен EXPIRES) {
если ( EXPIRES <= NOW)
то (объект старый)
иначе (объект свежий)
}
если (AGE > MAX_AGE) то (объект старый)
если (OBJ_DATE > OBJ_LASTMOD ) {
если (LM_FACTOR меньше PERCENT) то (объект свежий)
иначе (объект старый)
}
если (AGE <= MIN_AGE) то (объект свежий)
(объект старый)
По умолчанию (я эти числа изрядно увеличиваю):
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320 options
override-expire - нарушение стандарта HTTP! - использовать min
даже если явно задан expire
override-lastmod - использовать min даже для недавно
модифицированных объектов
reload-into-ims - нарушение стандарта HTTP! - преобразует
клиентские запросы типа no-cache в If-Modified-Since
ignore-reload - нарушение стандарта HTTP! - игнорировать
заголовки no-cache или reload в запросах клиентов
replacement_policy GDSF | LFUDA (частотные алгоритмы замещения объектов в
кеше вместо LRU; требуется --enable-heap-replacement при сборке)
reference_age 1 month (максимальное время хранения
неиспользуемого объекта до его удаления по LRU алгоритму; если места на
диске не хватает, то автоматически уменьшается)
quick_abort_min 16 KB (если клиент оборвал запрос, а
осталось докачать всего min KB, то squid докачает)
quick_abort_max 16 KB (если клиент оборвал запрос, и
осталось качать больше max KB, то прекратить)
quick_abort_pct 95 (если клиент оборвал запрос, а уже
получено больше чем pct процентов объекта, то докачать)
negative_ttl 5 minutes (некоторые негативные ответы тоже
кешируются - "connection refused "и "404 not found" - ttl задает их время
жизни в кеше; по-моему, хватит и 1 минуты)
positive_dns_ttl 6 hours
negative_dns_ttl 5 minutes
range_offset_limit 0 KB (если клиент делает запрос с
середины объекта, то offset_limit равный -1 вынуждает squid загрузить весь
объект в кеш до того как начать передачу клиенту - скажем 17го мегабайта ;)
-; offset_limit равный 0 означает. что squid никогда не будет грузить
больше, чем клиент запросил; offset_limit равен определенному числу
означает, что squid будет грузить весь объект, если начало запроса меньше
этого числа)
timeout's
connect_timeout 120 seconds (сколько времени ждать
соединения от squid к серверу)
peer_connect_timeout 30 seconds
siteselect_timeout 4 seconds (сколько времен разрешается
потратить на выбор URL из URN)
read_timeout 15 minutes (сколько времени разрешается ждать
следующего байта от сервера, достаточно и 5 минут)
request_timeout 30 seconds (сколько разрешается ждать
запроса после установления соединения, маловато)
client_lifetime 1 day (сколько времени разрешать клиенту
быть присоединенным к squid; в т.ч. в случае если он ушел не попрощавшись;
это перебор, хватит и 4 часов; соединение обрывается даже если происходит
передача данных!)
half_closed_clients on (разрешать наполовину закрытые
соединения - например чтение есть, а запись уже закрыта; не стоит их
баловать)
pconn_timeout 120 seconds (постоянные соединения с
серверами и другими кешами)
ident_timeout 10 seconds
shutdown_lifetime 30 seconds (сколько времени продолжать
обслуживание после получения SIGTERM or SIGHUP)
ACL - определение списка доступа (тип: тип объекта, строка: регулярное
выражение - шаблон для сравнения; по умолчанию чувствительное к регистру букв
(строчные/прописные); чтобы игнорировать регистр букв, надо использовать ключ
"-i") acl имя тип строка ... ... (логическое
ИЛИ) acl имя тип "имя файла" (по одному
параметру в строке) типы:
src ip-address/netmask ... (clients IP address)
src addr1-addr2/netmask ... (range of addresses)
dst ip-address/netmask ... (URL host's IP address)
myip ip-address/netmask ... (local socket IP
address)
srcdomain foo.com ... (reverse lookup, client IP)
dstdomain foo.com ... (Destination server from URL;
если в URL использовался IP, то делается попытка определить имя домена, если
не удалась, то подставляется слово "none")
srcdom_regex [-i] строка ... (regex matching
client name)
dstdom_regex [-i] строка ... (regex matching
server; если в URL использовался IP, то делается попытка определить имя
домена, если не удалась, то подставляется слово "none")
time [day-abbrevs]
[h1:m1-h2:m2] (где день это одна буква из
SMTWHFA)
url_regex [-i] строка (регулярное выражение
для всего URL)
urlpath_regex [-i] строка (регулярное
выражение для path-части URL)
port порт ... (перечень портов) в стандартной
конфигурации определяется ACL Safe_port для интервала 1024-65535; это
слишком слабое ограничение; лучше к безопасным портам отнести 32768-65535 (у
меня все клиентские порты начинаются с 32768 и firewall эа этим следит), и
отдельно всякие извращения перевода с русского на русский - 81, 82, 83, 88,
8000-8002, 8080-8083, 8091, 8100-8103, 8888
port порт1-порт2 (интервал портов)
myport порт ... (перечень портов)
proto [HTTP | FTP | ...]
method [GET | POST | ... ] (в т.ч. собственный
метод purge: acl PURGE method purge)
browser [-i] regexp (сопоставляется заголовок User-Agent)
ident username ... (строка REQUIRED сопоставляется
любо непустому слову)
src_as number ... (номера автономных систем - AS,
делается запрос к whois.ra.net на поиск !gASномер)
dst_as number ... (не более 253 или
поставить IP-адрес в as_whois; такой поток запросов RADB не выдерживает, так
что надо сделать несколько раз squid restart, чтобы таблица адресов
заполнилась)
proxy_auth username ... (можно использовать строку
REQUIREDдля любого имени пользователя)
snmp_community string ...
maxconn число (больше чем указанное число соединеной с
одного и того же IP)
права доступа
http_access allow|deny
[!]aclname ... (кому разрешать доступ к прокси по HTTP;
здесь и далее - логическое И)
icp_access allow|deny [!]aclname ...
(кому разрешать доступ к прокси по ICP)
miss_access allow|deny [!]aclname ...
(кому разрешить получать ответ MISS от нас)
cache_peer_access cache-host allow|deny
[!]aclname ... (ограничить запросы к данному соседу -
расширение для cache_peer_domain)
proxy_auth_realm Squid proxy-caching web server (строка
текста, которая будет выдана на экран клиента при запросе имени/пароля
доступа к кешу)
параметры администрирования
cache_mgr email (почтовый адрес, на который будет послано
письмо, если squid грохнется)
cache_effective_user nobody (если запустить squid от имени
root, то поменять UID на указанный)
cache_effective_group nogroup
visible_hostname имя-хоста (это имя будет упоминаться в
сообщениях об ошибках)
unique_hostname уникальное-имя (если нескольким кешам дали
одно и то же visible_hostname, то чтобы предотвратить циклы, надо определить
каждому из них уникальное имя)
hostname_aliases имя ... (список синонимов для нашего
имени хоста)
параметр саморекламы, посылаемой в http://ircache.nlanr.net/Cache/Tracker
announce_period 0 day (0 означает - не посылать никогда)
announce_host tracker.ircache.net
announce_port 3131
announce_file имя-файла (дополнительно к стандартно
информации - хост, порт - посылается этот файл)
параметры для работы в режиме ускорителя http-сервера
httpd_accel_host hostname (если нужна поддержка
виртуальных хостов, в частности для transparent proxy, то вместо имени
указать virtual)
httpd_accel_port port
httpd_accel_with_proxy on|off (по умолчанию кеширование
для ускоряемого сервера выключено)
httpd_accel_uses_host_header on|off (для работы в
прозрачном режиме требуется включить, иначе виртуальные сервера не будут
правильно кешироваться, но т.к. squid не проверяет соответствие заголовка
Head: и имени в URL, то это опасно. Я так понимаю, что можно подсовывать в
кеш страницы с одного сервера под именем другого, затем когда нормальный
пользователь запросит страницу с этого другого сервера, то он получит ее из
кеша, куда она попала с первого сервера. Исправлено в 2.3)
разное
dns_testnames netscape.com internic.net nlanr.net
microsoft.com (список имен хостов на примере которых проверяется
работоспособность DNS, чтобы запретить проверку надо использовать ключ
-D)
logfile_rotate 10 (squid -k rotate переименовывает
журнальные файлы, данный параметр задает количество старых копий для
ротации)
append_domain .deol.ru (добавляется к имени хоста, если в
нем нет ни одной точки)
tcp_recv_bufsize 0 bytes (0 означает, что надо
использовть размер буфера по умолчанию)
err_html_text строка (подставляется в шаблоны текстов
сообщений об ошибках - лежат в директории error - вместо %L)
deny_info err_page_name acl (запросы, не прошедшие
проверку в http_access, проверяются на соответствие acl
выдается соответствующее сообщение об ошибке из файла
page_name)
memory_pools on|off (по умолчанию, однажды захваченная, но ныне
не используемая память не отдается обратно в систему, off позволяет
освобождать ее)
memory_pools_limit байт (максимальное количество
неиспользуемой памяти, которое squid будет придерживать; если 0, то
придерживать все, что было захвачено; см. memory_pools)
forwarded_for on|off (есл включено - по умолчанию - то
squid будет вставлять IP-адрес или имя в заголовк перенаправляемых
HTTP-запросов: "X-Forwarded-For: 192.1.2.3"; если выключено, то
"X-Forwarded-For: unknown")
log_icp_queries on|off (записывать ли в журнал
ICP-запросы)
icp_hit_stale on|off (возвращать ли ответ ICP_HIT для
зачерствевших объектов; по умолчанию - off)
minimum_direct_hops 4 (If using the ICMP pinging stuff, do
direct fetches for sites which are no more than this many hops away)
cachemgr_passwd password action action ...
(задание пароля для действий по администрированию squid; чтоб запретить
действие - поставьте пароль disable; чтоб разрешить действие без проверки
пароля - поставьте пароль none, кроме действий config и shutdown; неполный
список действий: 5min, 60min, asndb, authenticator, cbdata, client_list,
comm_incoming, config, counters, delay, digest_stats, dns, events,
filedescriptors, fqdncache, histograms, http_headers, info, io, ipcache,
mem, menu, netdb, non_peers, objects, pconn, peer_select, redirector,
refresh, server_list, shutdown, store_digest, storedir, utilization,
via_headers, vm_objects; имя действия all - для всех действий)
store_avg_object_size 13 KB (предполагаемый средний размер
объекта, используемый для расчетов; у меня - 9КБ; не д.б. вдвое больше
реального или возникнут проблемы)
store_objects_per_bucket 20 (число объектов на
хеш-корзину, чем меньше, тем больше будет создано корзин)
client_db on|off (сбор статистики о клиентах, по умолчанию
- включен)
netdb_low 900
netdb_high 1000 (нижняя верхняя границы для базы данных
измерения ICMP)
netdb_ping_period 5 minutes (минимальное время между
ping-ами в одну и ту же сеть)
query_icmp on|off (должны ли соседи включать в ICP ответы
включать ICMP данные; соответствующие данные собираются если сосед
сконфигурирован с --enable-icmp, в это случае он измеряет путь до
http-сервера помощью ICMP, выключен по умолчанию)
test_reachability on|off (есл включить, то ответ ICP_MISS будет
заменяться на ICP_MISS_NOFETCH если сервер отсутствует в ICMP базе данных
или RTT равен нулю)
buffered_logs on|off (при включении запись в журнал буферизуется
и слегка ускоряется)
reload_into_ims on|off (при включении запросы типа
no-cache или reload будут преобразовываться в
If-Modified-Since; является нарушение стандартов; более гибкая
настройка через refresh_pattern)
always_direct allow|deny [!]aclname
... (запросы, удовлеворяющие данным acl не кешировать, а всегда направлять к
первоисточнику)
never_direct allow|deny [!]aclname
...
anonymize_headers allow|deny header_name ...
(перечень заголовков, которые нуждаются в анонимизации; по умолчанию - ни
один; можно использовать несколько строк, но все он должны иметь либо
allow, либо deny)
fake_user_agent none (если заголовок User-Agent
фильтруется с помощь анонимизатора, то подставляется эта строка)
icon_directory /usr/local/squid/etc/icons
error_directory
minimum_retry_timeout 5 seconds (есл сервер имеет
несколько IP адресов, то connection timeout делится на их количество, данный
параметр ограничивает получившийся результат снизу, маловато)
maximum_single_addr_tries 3 (сколько раз пытаться
достучаться до сервера, имеющего 1 IP адрес; есл сервер имеет несколько IP
адресов, то каждый из них будет опробован ровно один раз)
snmp_port 3401 (порт, который слушает squid для SNMP
запросов)
forward_snmpd_port 0 (если задан порт, то на него
перенаправляются все SNMP-запросы; убрано в 2.3)
snmp_access allow|deny [!]aclname ...
(кто будет допущен к SNMP порту, по умолчанию - никто)
snmp_incoming_address 0.0.0.0
snmp_outgoing_address 0.0.0.0
as_whois_server имя (whois сервер, используемый для
получения номера AS; только при запуске; whois.ra.net; лучше поставить IP
адрес, иначе нельзя будет использовать более 250 AS)
wccp_router ip-адрес
wccp_incoming_address IP-адрес
wccp_outgoing_address IP-адрес
wccp_version ?
incoming_icp_average 6
incoming_http_average 4
min_icp_poll_cnt 8
min_http_poll_cnt 8
max_open_disk_fds
offline_mode on|off (если включить, то squid будет брать
объекты только из кеша и не будет пытaться обращаться к первоисточникам)
uri_whitespace strip(что делать с запросами, имеющими
пробелы в URI)
strip - удалять пробелы
deny - сообщать Invalid Request
allow - передавать как есть
encode - кодировать в соответствии с RFC1738 передавать дальше
chop - остаток после первого же пробела отбрасывать
broken_posts allow|deny acl ... (если запрос
удовлетворяет acl и имеет тип PUT/POST, то squid посылает дополнительный
CRLF после тела запроса, чтоб успокоить неправильно написанный сервер)
mcast_miss_addr адрес (по этому multicast адресу
посылается сообщение при каждом cache miss)
mcast_miss_port порт
mcast_miss_encode_key ключ
prefer_direct on
strip_query_terms on (удалять параметры query перед
записью в журнал)
coredump_dir (по умолчанию в cache_dir)
redirector_bypass on | off (если включен и все редиректоры
заняты, то не обрабатывать URI редиректором; если выключен и нет свободных
редиректоров, то аварийное завершение - применяется, если редиректор
используется для аутентификации)
ignore_unknown_nameservers on (игнорировать сообщения от
DNS-серверов, которые мы не запрашивали)
chroot (делать chroot после разбора конфигурации; reconfigure
работать не будет, если прислушиваемся к портам < 1024)
параметры DELAY
POOL, ограничивают интенсивность использования кеша для отдельных хостов и
подсетей
delay_pools 0
delay_class номер-пула класс (д.б. ровно
один пул каждого класса; классы: 1 - 3)
delay_access номер-пула allow|deny acl ...
delay_parameters pool aggregate network
individual
delay_initial_bucket_level 50
работа с БД digest
digest_generation on
digest_bits_per_entry
digest_rebuild_period
digest_rewrite_period
digest_swapout_chunk_size
digest_rebuild_chunk_procentage
Настройка прав доступа в squid.conf:
acl all src 0.0.0.0/0.0.0.0
acl localhost src 127.0.0.1/255.255.255.255
acl manager proto cache_object
acl managerhost src 1.2.3.4/255.255.255.255
http_access allow manager localhost
http_access allow manager managerhost
http_access deny manager
http_access allow all
cachemgr_passwd пароль команда
Управление squid с помощью программы client:
/usr/local/squid/bin/client cache_object://localhost/команда
Управление squid с помощью cachemgr.cgi (лично я не пробовал и
другим не советую):
cachemgr.cgi в /usr/local/squid/cgi-bin
конфигурация Apache
ScriptAlias /Squid/cgi-bin/ /usr/local/squid/cgi-bin/
ограничение доступа по адресу хоста <Location /Squid/cgi-bin/cachemgr.cgi>
order deny,allow
deny from all
allow 1.2.3.4
</Location>
ограничение доступа по паролю <Location /Squid/cgi-bin/cachemgr.cgi>
AuthUserFile /path/to/password/file
AuthGroupFile /dev/null
AuthName User/Password Required
AuthType Basic
require user cachemanager
</Location>
Требования к памяти:
72 байта на каждый объект
Disk buffers for reading and writing
Network I/O buffers
IP Cache contents
FQDN Cache contents
Netdb ICMP measurement database
Per-request state information, including full request and reply headers
Miscellaneous statistics collection
"Hot objects" which are kept entirely in memory
Причем большая часть используемой памяти не должна свопироваться
(иначе работает безумно медленно). Например, при кеше в 7 ГБ (800 тысяч
объектов) требуется 128 МБ оперативной памяти. При восстановлении оглавления
кеша (после аварийной перезагрузки) требуется удвоенный объем.
Как уменьшить потребности:
попробовать GNU malloc или dlmalloc (./configure --enable-dlmalloc)
уменьшить cache_mem (пока не появятся сообщения в cache.log)
memory_pools off
уменьшить размер кеша (cache_swap) - единственный существенный способ
Squid поддерживает размер кеша между low и high, регулярно
запуская процедуру удаления объектов (чем ближе мы к high, тем агрессивнее
очистка). Вместо удаления можно использовать очистку файлов (truncate) пока
хватает inode. Удаление производится асинхронно внешней программой unlinkd. Если
объект тянется в данный момент, то он не удаляется. Если объект "отрицательно
кеширован", то он удаляется. Если объект частный, то он удаляется. Алгоритмы
замешения:
LRU. Если время с последнего использования объекта больше некой границы
(threshold), то объект удаляется. Граница динамически вычисляется на основе
заполненности кеша и low/high маркеров (начальное/максимальное значение
задается в squid.conf). При стабилизации размера кеша граница представляет
время полного заполнения (замещения) кеша в текущих условиях (типичное
значение от 1 до 10 дней; если меньше 3 дней, то рекомендуется увеличить кеш).
GDSF. Стремится удержать маленькие полулярные объекты (растет hitrate,
падает byterate).
LFUDA. hitrate падает, byterate - растет.
Сравнение алгоритмов проводится в
Enhancement and
Validation of Squid's Cache Replacement Policy
Evaluating
Content Management Techniques for Web Proxy Caches
Кешируемость объектов в зависимости от кода возврата HTTP: Caching Code
Successful 2xx
c 200 OK
201 Created
202 Accepted
c 203 Non-Authoriative Information *
E 204 No Content
205 Reset Content *
? 206 Partial Content *
Redirection 3xx
C 300 Multiple Choices
C 301 Moved Permanently
t 302 Moved Temporarily
- 303 See Other *
- 304 Not Modified
E 305 Use Proxy (proxy redirect) *
Client Error 4xx
E 400 Bad Request
- 401 Unauthorized
402 Payment Required *
E 403 Forbidden
E 404 Not Found
E 405 Method Not Allowed *
406 Not Acceptable *
- 407 Proxy Authentication Required *
408 Request Timeout *
409 Confict *
C 410 Gone *
411 Length Required *
412 Precondition Failed *
413 Request Entity To Large *
E 414 Request-URI Too Long *
415 Unsupported Media Type
Server Error 5xx
E 500 Internal Server Error
E 501 Not Implemented
E 502 Bad Gateway
E 503 Service Unavailable
E 504 Gateway Timeout *
505 HTTP Version Not Supported *
Notes:
* HTTP 1.1
c Cached unless a query response without expiry information
C Cached
E Negatively cached if no expiry headers
t Cached only if expiry information
- Not cached
Unless other said, the response code is not cached.
Кешируемость в зависимости от заголовков:
Responses with Cache-Control: Private are NOT cachable.
Responses with Cache-Control: No-Cache are NOT cachable.
Responses with Cache-Control: No-Store are NOT cachable.
Responses for requests with an Authorization header are cachable ONLY if
the reponse includes Cache-Control: Public.
Responses with Vary headers are NOT cachable because Squid does not yet
support Vary features.
Пул - набор групп ведер определенного класса. Группа ведер -
часть пула, привязанная к хосту, сети или одно на всех. Ведро - ограниченная
емкость, в которую с ограниченной скоростью вливается внешний трафик, и из
которой он раздается клиенту. Если ведро заполняется полностью, то запросы к
серверу останавливаются, если пустеет, то увеличиваются (а клиент ждет).
Определены 3 класса пулов:
одно ведро на всех из этого класса
одно общее ведро и 255 отдельных для каждого хоста из C-сетки
255 ведер для каждой сетки (класс B) и отдельное для каждого хоста
Пример конфигурации: delay_pools 3 # 3 delay pools
delay_class 1 1 # pool 1 is class 1
delay_class 2 1 # pool 2 is class 1
delay_class 3 3 # pool 3 is class 3
delay_access 1 allow staff
delay_access 1 deny all
delay_access 2 allow students
delay_access 2 deny all
delay_access 3 allow college
delay_access 3 deny all
delay_parameters 1 640000/640000
delay_parameters 2 64000/64000
delay_parameters 3 64000/64000 32000/64000 6400/32000
# total_rest/total_max net_rest/net_max ind_rest/ind_max
где
total - на всех
net - на подсеть
ind - на отдельный адрес
rest - скорость заполнения (байт/сек)
max - объем ведра (байт)
Ограничение для модемных клиентов, чтобы squid не подкачивал файл
пока клиент еще не считал предыдущую порцию. acl clients src адреса
delay_pools 1
delay_class 1 2
delay_access 1 allow clients
delay_access 1 deny all
delay_parameters 1 -1/-1 8000/4000
Прижать любителей MP3: acl multimedia urlpath_regex -i .mp3$ .mpeg$ .avi$ .mov$
delay_pools 1
delay_class 1 1
delay_access 1 allow multimedia
delay_access 1 deny all
delay_parameters 1 16000/64000
quick abort д.б. установлен маленьким чтобы объект не качался на
полной скорости после отпадения клиента (нет клиента для запроса - нет
ограничений).
В процессе участвуют маршрутизатор, Linux и Squid:
http-пакеты, бегущие мимо, должн отлавливаться маршрутизаторо
переадресовываться на proxy-сервер. Как понять, что это http-пакет? Будем
считать, что все пакеты, направленные на tcp/80, являются запросами на HTTP.
Возникал вопрос: а может кешировать и другие порты? После обработки статистики
(большой объем - 422MB, в ситуации с добровольным использованием proxy)
выяснилось, что всего обращений было 3120260, из них HTTP - 92%. Из них на
нестандартные порты - 2.3% (3128 - 0.05%, 8000 - 0.09%, 8001 - 0.13%, 8080 -
1.06%, 8081 - 0.15%, 8100 - 0.11%, 8101 - 0.46%). Я не вижу смысла бороться за
1%, разве что найду готовое решение ;)
Proxy-сервер уже стоит на пути этих пакетов (например, squid установлен
на маршрутизаторе или firewall).
Cisco отлавливает такие пакеты и с помощью route-map перенаправляет их
на proxy-сервер.
ОС proxy-сервера должна принимать эти пакеты, как родные, и перенаправлять
к squid
linux 2.2.
конфигурация ядра: CONFIG_EXPERIMENTAL=y # включен и так
CONFIG_NET=y # само собой CONFIG_FIREWALL=y # чтобы иметь
возможность тонко управлять маршрутизацией (несовместим с FAST_SWITCHING)
# CONFIG_IP_ALIAS is not set # у меня включено и
вроде работает (при нехватке ОП зависает драйвер eth0, если ALIAS
выключить, то прикладная программа) CONFIG_INET=y # включен и так
# CONFIG_IP_MULTICAST is not set # а почему
нельзя? CONFIG_IP_FIREWALL=y # чтобы иметь возможность тонко
управлять IP-маршрутизацией CONFIG_IP_MASQUERADE=y # а необходимо ли это для transparent proxy?
CONFIG_IP_TRANSPARENT_PROXY=y CONFIG_IP_ROUTER=y # необязательно,
но может ускорить обработку пакетов
при загрузке
включать ip_forward, ip_always_defrag (вставить в загрузочные скрипты:
/etc/rc.d/init.d/network) echo 1 > /proc/sys/net/ipv4/ip_forward #
ядро д.б. сконфигурировано поддержкой /proc и sysctl) echo 1 >
/proc/sys/net/ipv4/ip_always_defrag # в ядре 2.2.12 указывается во время
конфигурации
ipchains (ipfwadm в
ядре 2.2 работать не будет)
ipchains -A input -p TCP -d 127.0.0.1/32 www -j ACCEPT
ipchains -A input -p TCP -d адрес-хоста/32 www -j
ACCEPT
ipchains -A input -p TCP -d 0/0 www -j REDIRECT 3128
дополнительные правила для firewall и др.
squid д.б. скомпилирован так, чтобы он принимал эти пакеты, как родные.
linux 2.2 и squid 2.2. Происходит само собой.
squid д.б. сконфигурирован так, чтобы обрабатывать эти пакеты
соответствующим образом.
http_port 3128 # redirect д.б. на этот порт
httpd_accel_host virtual # имитирует акселератор http-сервера, но
не совсе нормально
httpd_accel_port 80 # а если перенаправляли
не только 80 порт?
httpd_accel_with_proxy on # иначе при работе в режиме
акселератора отключается кеширование
httpd_accel_uses_host_header on # иначе виртуальные домены будут
неправильно кешироваться (см. замечание про
безопасность)
Проблема. дырка в firewall: запрос
приходит на прокси-сервер, который от своего имени (уже изнутри) лезет куда не
надо.
Ссылки:
FAQ
The Compleat (sic)
Idiot's Guide to Transparent Proxy with Linux and Squid
В комплекте поставки идут access-extract.pl, (увеличено
MaxEntries до ...) получающая на стандартный ввод журнал access.log
выдающая на стандартный выво промежуточный результат, и
access-summary.pl (убрал выдачу ICP, которой у меня нет, за счет чего
увеличил ширину колонки с именами хостов; в xsort изменил сортировку с COUNT на
BYTES), делающая из него красивый отчет. Внутри используется
squid-logs.pl. Его надо расширить новыми суффиксами имен файлов (bmp -
Image; rm, mid, mp3 - Audio; pl, cgi, shtml, php, php3, phtml, asp, dll -
Dynamic; rpm, cab, avc - Bundle; css - HTML; koi - Text; js - Software). За день
получается 60МБ в access.log, поэтому у меня не хватает терпения
дождаться результатов работы других процедур из комплекта.
Формат access.log (запись делается, когда клиент закрывает
socket; для наших 300 тысяч запросов в день получается 60 MB в день!):
timestamp (unix time in ms)
elapsed (ms)
client IP address
type/HTTP reply code, где type:
TCP_HIT (верная копия объекта нашлась в кеше)
TCP_MEM_HIT
TCP_NEGATIVE_HIT
TCP_MISS (запрашиваемый объект не был в кеше)
TCP_EXPIRED (объект был в кеше, но старый)
TCP_CLIENT_REFRESH (клиент запросил reload - no-cache pragma)
TCP_REFRESH_HIT (объект в кеше был старым, был сделан IMS-запрос к
источнику и тот вернул "304 Not Modified")
TCP_REFRESH_MISS (объект в кеше был старым, был сделан IMS-запрос к
источнику и тот вернул обновленное содержание)
TCP_IMS_HIT (клиент выдал IMS-запрос, объект оказался в кеше и свежим)
TCP_IMS_MISS (клиент выдал IMS-запрос для просроченного объекта)
TCP_REF_FAIL_HIT (объект в кеше староват, но запросить новую копию не
удалось)
TCP_SWAPFAIL (объект д.б. в кеше, но не смогли извлечь)
TCP_DENIED
UDP_...
ERR_CLIENT_ABORT
ERR_NO_CLIENTS
ERR_READ_ERROR
ERR_CONNECT_FAIL
ERR_...
size (bytes to client)
method (GET, POST, ...)
URL
ident ("-", если недоступен)
hierarhy data/Hostname
DEAD_NEIGHTBOR
DEAD_PARENT
LOCAL_IP_DIRECT
FIRST_PARENT_MISS
FIRST_UP_PARENT
PARENT_HIT (UDP-запрос к parent вернулся с подтверждением)
SINGLE_PARENT
PARENT_UDP_HIT_OBJECT (объект оказался у parent и поместился в
UDP-ответе)
DIRECT (объект был запрошен с оригинального сервера)
...
тип содержимого (MIME тип/подтип)
Формат store.log:
time (unix format with ms)
action
RELEASE (удален из кеша)
SWAPOUT (сохранен на диск)
SWAPIN (был на диске, загружен в память)
HTTP reply code
HTTP Date: reply header
HTTP Last-Modified: reply header
HTTP Expires: reply header
HTTP Content-Type: reply header
HTTP Content-Length: reply header
реально полученное число байт (если не совпадает с предыдущим числом,
объект не хранится)
HTTP метод (GET, POST, ...)
ключ доступа (обычно URL, частные объекты еще и последовательный номер и
метод)
Еще можно собирать useragent.log, все HTTP-заголовки и отладочную
информацию. Я собираю только access.log и этого очень много.
Время в журналах записывается в Unix-формате (число милисекунд с
1 января 1970 года), что неудобно. Преобразовать в человеческий формат можно,
например, с помощью gawk: awk '{print strftime("%Y%m%d%H%M%S",$1), $2, $3,
$4, $5, $6, $7, $8, $9, $10, $11}' (printlog.sh) или perl:
s/^d+.d+/localtime $&/e;
Частота обращений к объектам извлекается из access.log с помощью
(url_freq.sh) awk '{print $7}' | sort | awk -f
/usr/local/bin/count.awk | sort -nr +1 или без учета anchor и
query-частей URL (url_freq_noq.sh) awk '{print $7}' | awk -F'?'
'{print $1}' | awk -F';' '{print $1}' | awk -F'#' '{print $1}' | sort | awk -f
/usr/local/bin/count.awk | sort -rn +1
redirector - внешняя программа (небуфферизованный в/в), в цикле
читает с stdin URL и пишет на stdout преобразованный URL (или пустую строку,
если нет преобразований). Преобразование происходит после проверки ACL, но до
проверки на присутствие в кеше. Формат входной строки (поля, разделенные
пробелами):
URL
ip-address/fqdn (если fqdn нет, то "-")
ident ("-", если нет)
method (GET, POST, ...)
В качестве примера использования редиректора для уменьшения
трафика в поставке приводится редиректор, производящий нормализацию URL
(приведение к стандартному виду), что увеличивает вероятность попадания в кеш. А
также редиректор преобразующий запросы на загрузку всяких там IE, Netscape и пр.
с различных зеркал в запросы к локальному www-серверу (автор клянется, что это
дает 15%). См. также про борьбу с баннерами.
Примеры redirectors:
Squirm
Jesred
(усовершенствованный Squirm)
An ultrafast and free filter,
redirector and access controller
Только не будем спорить о морали :) Но и в transparent режиме
этого делать не надо. Поставьте себе локальный прокси и радуйтесь. Кстати, теми
же методами можно бороться со счетчиками и порно.
Превращение банеров-картинок в рваные прямоугольники:
Насобирать "вредителей" (в виде регулярных выражений)
Заводим файлы в /usr/local/squid/etc:
banners_path_regex - по одному регулярному выражению на строку
banners_regex - по одному регулярному выражению на строку
banners_exclusion (это строки, трактуемые в предыдущих файлах как
баннеры, но их лучше не трогать - JavaScript всякие)
В squid.conf acl banners_path_regex urlpath_regex "/usr/local/squid/etc/banners_path_regex"
acl banners_regex url_regex "/usr/local/squid/etc/banners_regex"
acl banners_exclusion url_regex "/usr/local/squid/etc/banners_exclusion"
http_access deny banners_path_regex !banners_exclusion
http_access deny banners_regex !banners_exclusion
Замена рекламных банеров на пустое место. Если рваные
прямоугольники оскорбляют эстетические чувства. Предполагается, что в исходных
страницах заданы width и height, иначе страница поплывет (можно заменять банеры
на картинки соответствующего размера, но это большой труд).
Насобирать "вредителей" (в виде регулярных выражений)
На своем http-сервере завести "заменитель" рекламных картинок void.gif
Настраиваем redirector в squid.conf (если он уже используется, то добавить
к старому; м.б. еще настроить redirector_access): redirect_program
/usr/local/squid/bin/banners.pl
banners.pl (perl выбран для простоты демонстрации): #!/usr/bin/perl (или где perl живет)
$|=1;
while (<>) {
s@регулярное-выражение@http://www.nospam.org/nospam.gif@;
print;}
К сожалению, использование "http_access deny" для блокировки
JavaScript программ не получается (броузер не показывает страницу совсем).
Поэтому приходится заменять реальный скрипт через redirect (см. выше) на
что-нибудь безобидное (и каждый случай обрабатывать отдельно :(. Например, если
исходный скрипт открывал окно с рекламой (<script src=...>), то вместо
него подсовываем <html><head>
<script language="JavaScript"><!-- window.close(); //--></script>
</head><body></body></html>
вместо tx3 (если он встроен страницу с помощью SSI, то не
поможет, да и зачем тогда его резать?): document.write(" ");
Ссылки:
Борьба с баннерами с помощью
Squid'а
Фильтры
Копия классической статьи
Ковалева (к сожалению, оригинал недоступен)
Простейшие случаи иерархии. Основной squid с консервативными настройками и
вспомогательный с агрессивными настройками (антибаннер ;).Консервативный:
ICP выключен
никаких соседей
maximum_object_size побольше
большой объем кеша на диске
стандартные (почти) настройки refresh_pattern
transparent proxy Агрессивный:
ICP выключен
cache_peer основной parent 3128 3130 no-query default # если
не нашел объект в своем кеше, то обращаться к parent, а не к источнику
prefer_direct off
hierarchy_stoplist - пустой
maximum_object_size побольше
очень небольшой объем кеша на диске (пробовал поставить нулевой размер и
cache_peer ... proxy-only, но возникают проблемы при обработке ошибок)
собственно агрессивная настройка:
redirect
refresh
acl, http_access, deny_info
Закрыть доступ к какой-то информации для клиентовbadobjects - это
произвольное имя ACL; ERR_ACCESS_DENIED - имя файла в
/usr/lib/squid/errors/English или в подобном месте, вместо этого файла можно
поставить для каждой ситуации свой файл; воздействие http_access зависит от
места, в которое его поставить; если squid получает от parent TCP_DENIED, то он
лезет напрямую:
acl badobjects url_regex регулярное-выражение
http_access deny badobjects
deny_info ERR_ACCESS_DENIED badobjects
Шаблон для борьбы с RealPlayerhttp://[^/]+/SmpDsBhgRl
Как удалить объект из кешаВ squid.conf: acl PURGE method purge
acl localhost src 127.0.0.1
http_access allow purge localhost
http_access deny purge
Теперь для каждого удаляемого объекта: client -m PURGE URI
Использование дополнительного канала для
доступа в Интернет |
Имеем маршрутизатор (Cisco) с двумя каналами доступа в Интернет
через двух различных провайдеров. Клиентские компьютеры расположены в адресном
пространстве одного из них, а хочется нагрузить оба канала на прием. Создаем
файл as.list, содержащий список AS ,к которым мы хотим обращаться через второй
канал. Конфигурируем squid:
acl all src 0.0.0.0/0.0.0.0
acl second dst_as "as.list"
cache_peer второй-squid parent 3129 0 no-query default
(описываем вспомогательный squid как старший для нас)
cache_peer_access второй-squid allow second (обращаться к
нему только, если сервер находится в AS из списка)
hierarchy_stoplist какой-нибудь-бред deny all (чтобы cgi-bin
и QUERY тоже шли по этому маршруту)
never_direct allow second (не обращаться напрямую к серверам из AS
списка)
never_direct deny all Конфигурируем вспомогательный
squid-сервер (мижно даже на том же хосте - специально выбран нестандартный порт;
только прямого доступа к нему давать не надо):
никаких соседей/icp/htcp
tcp_outgoing_address из адресного пространства второго провайдера
никакого кеширования
Sergey E. Bogomolov
|