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

Полезные ключи ./configure (--help)

  • --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)

Ключи запуска squid

  • -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 (более быстрое восстановление после сбоев)

Формат squid.conf

  • сетевые параметры
    • 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) то (объект свежий)
      (объект старый)
      
      
      По умолчанию (я эти числа изрядно увеличиваю):
      1. refresh_pattern ^ftp: 1440 20% 10080
      2. refresh_pattern ^gopher: 1440 0% 1440
      3. 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 (Cache Manager)

Настройка прав доступа в 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) - единственный существенный способ

Алгоритмы замещения кеша (LRU, GDSF, LFUDA)

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.

Справедливый дележ канала (delay pool)

Пул - набор групп ведер определенного класса. Группа ведер - часть пула, привязанная к хосту, сети или одно на всех. Ведро - ограниченная емкость, в которую с ограниченной скоростью вливается внешний трафик, и из которой он раздается клиенту. Если ведро заполняется полностью, то запросы к серверу останавливаются, если пустеет, то увеличиваются (а клиент ждет).

Определены 3 класса пулов:

  1. одно ведро на всех из этого класса
  2. одно общее ведро и 255 отдельных для каждого хоста из C-сетки
  3. 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 д.б. установлен маленьким чтобы объект не качался на полной скорости после отпадения клиента (нет клиента для запроса - нет ограничений).

Squid как transparent proxy (только http)

В процессе участвуют маршрутизатор, Linux и Squid:

  1. 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-сервер.
  2. ОС proxy-сервера должна принимать эти пакеты, как родные, и перенаправлять к squid
    • linux 2.2.
      1. конфигурация ядра:
        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 # необязательно, но может ускорить обработку пакетов
      2. при загрузке включать 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 указывается во время конфигурации
      3. 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 и др.
  3. squid д.б. скомпилирован так, чтобы он принимал эти пакеты, как родные.
    • linux 2.2 и squid 2.2. Происходит само собой.
  4. 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 в день!):

  1. timestamp (unix time in ms)
  2. elapsed (ms)
  3. client IP address
  4. 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_...
  5. size (bytes to client)
  6. method (GET, POST, ...)
  7. URL
  8. ident ("-", если недоступен)
  9. 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 (объект был запрошен с оригинального сервера)
    • ...
  10. тип содержимого (MIME тип/подтип)

Формат store.log:

  1. time (unix format with ms)
  2. action
    • RELEASE (удален из кеша)
    • SWAPOUT (сохранен на диск)
    • SWAPIN (был на диске, загружен в память)
  3. HTTP reply code
  4. HTTP Date: reply header
  5. HTTP Last-Modified: reply header
  6. HTTP Expires: reply header
  7. HTTP Content-Type: reply header
  8. HTTP Content-Length: reply header
  9. реально полученное число байт (если не совпадает с предыдущим числом, объект не хранится)
  10. HTTP метод (GET, POST, ...)
  11. ключ доступа (обычно 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, как средство оптимизации

redirector - внешняя программа (небуфферизованный в/в), в цикле читает с stdin URL и пишет на stdout преобразованный URL (или пустую строку, если нет преобразований). Преобразование происходит после проверки ACL, но до проверки на присутствие в кеше. Формат входной строки (поля, разделенные пробелами):

  1. URL
  2. ip-address/fqdn (если fqdn нет, то "-")
  3. ident ("-", если нет)
  4. method (GET, POST, ...)

В качестве примера использования редиректора для уменьшения трафика в поставке приводится редиректор, производящий нормализацию URL (приведение к стандартному виду), что увеличивает вероятность попадания в кеш. А также редиректор преобразующий запросы на загрузку всяких там IE, Netscape и пр. с различных зеркал в запросы к локальному www-серверу (автор клянется, что это дает 15%). См. также про борьбу с баннерами.

Примеры redirectors:

  • Squirm
  • Jesred (усовершенствованный Squirm)
  • An ultrafast and free filter, redirector and access controller

Борьба с баннерами

Только не будем спорить о морали :) Но и в transparent режиме этого делать не надо. Поставьте себе локальный прокси и радуйтесь. Кстати, теми же методами можно бороться со счетчиками и порно.

Превращение банеров-картинок в рваные прямоугольники:

  1. Насобирать "вредителей" (в виде регулярных выражений)
  2. Заводим файлы в /usr/local/squid/etc:
    • banners_path_regex - по одному регулярному выражению на строку
    • banners_regex - по одному регулярному выражению на строку
    • banners_exclusion (это строки, трактуемые в предыдущих файлах как баннеры, но их лучше не трогать - JavaScript всякие)
  3. В 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, иначе страница поплывет (можно заменять банеры на картинки соответствующего размера, но это большой труд).

  1. Насобирать "вредителей" (в виде регулярных выражений)
  2. На своем http-сервере завести "заменитель" рекламных картинок void.gif
  3. Настраиваем redirector в squid.conf (если он уже используется, то добавить к старому; м.б. еще настроить redirector_access):
    redirect_program /usr/local/squid/bin/banners.pl
  4. 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("&nbsp;");

Ссылки:

  • Борьба с баннерами с помощью 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

Шаблон для борьбы с RealPlayer

http://[^/]+/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