Представляет собой 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-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=
-
type
-
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_peer hostname type proxy-port icp-port options (каждый сосед описывается отдельной строкой)
- размер кеша
- 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
- 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/
- ограничение доступа по адресу хоста
order deny,allow deny from all allow 1.2.3.4 - ограничение доступа по паролю
AuthUserFile /path/to/password/file AuthGroupFile /dev/null AuthName User/Password Required AuthType Basic require user cachemanager
Требования к памяти:
- 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 и др.
- конфигурация ядра:
- linux 2.2.
- 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 (см. выше) на что-нибудь безобидное (и каждый случай обрабатывать отдельно :(. Например, если исходный скрипт открывал окно с рекламой (