Наши партнеры

Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

Вперед Назад Содержание

7. Проблемы использования

7.1 Как я могу посмотреть системную статистику Squid?

Дистрибутив Squid включает в себя CGI-утилиту, называемую cachemgr.cgi, которая может исползоваться для просмотра статистики по Squid через web-броузер. Этот документ имеет секцию, посвященную использованию cachemgr.cgi, которую вам необходимо прочитать, для получения более подробной информации.

7.2 Как мне найти наибольший объект в моем кеше?

        sort -r -n +4 -5 access.log | awk '{print $5, $7}' | head -25

7.3 Я хочу перерзапустить Squid с чистым кешем.

Note: Информация, представленная здесь верна для вересии 2.2.

Прежде всего необходимо остановить Squid. Используйете команду:

        % squid -k shutdown

Самый быстрый способ перезапустить прокси с чистым кешем - переписать файл swap.state для каждой из cache_dir в вашем конфигурационном. Заместье, что вы не можете просто удалить или обнулить файл swap.state. Взамен этого просто добавьте в него один ничего незначащий байт. К примеру:

        % echo "" > /cache1/swap.state
Повторите операцию для каждой cache_dir и пперезапустите Squid. Убедитесь, что то владелец swap.state и права на него остались прежними!

Другой способ, который займет больше времени - создать заново все директории cache_dir. Но сначала вы должны удалить существующие директории. Например, это может быть сделано так:

        % cd /cache1
        % mkdir JUNK
        % mv ?? swap.state* JUNK
        % rm -rf JUNK &
Повторите операцию для других cache_dir, после чего укажите Squid создать новые директории:
        % squid -z

7.4 Как я могу проксировать/кешировать Real Audio?

от Rodney van den Oever, и James R Grinter

  • Установите RealPlayer на использование HTTP-порта вашего сервера Squid (3128).
  • Перейдите в закладку Preferences->Transport, выберите Use specified transports и используя копку Specified Transports, выберите использовать HTTP Only.

В руководстве по RealPlayer (и RealPlayer Plus) сказано:

Use HTTP Only
        Select this option if you are behind a firewall and cannot
        receive data through TCP.  All data will be streamed through

        Note:  You may not be able to receive some content if you select
        this option.

Снова из документации:

RealPlayer 4.0 identifies itself to the firewall when making a
request for content to a RealServer.  The following string is
attached to any URL that the Player requests using HTTP GET:


Thus, to identify an HTTP GET request from the RealPlayer, look


The Player can also be identified by the mime type in a POST to
the RealServer.  The RealPlayer POST has the following mime


Note that the first request is a POST, and the second has a '?' in the URL, so standard Squid configurations would treat it as non-cachable. It also looks rather ``magic.''

HTTP is an alternative delivery mechanism introduced with version 3 players, and it allows a reasonable approximation to ``streaming'' data - that is playing it as you receive it. For more details, see their notes on HTTP Pseudo-Streaming.

It isn't available in the general case: only if someone has made the realaudio file available via an HTTP server, or they're using a version 4 server, they've switched it on, and you're using a version 4 client. If someone has made the file available via their HTTP server, then it'll be cachable. Otherwise, it won't be (as far as we can tell.)

The more common RealAudio link connects via their own pnm: method and is transferred using their proprietary protocol (via TCP or UDP) and not using HTTP. It can't be cached nor proxied by Squid, and requires something such as the simple proxy that Progressive Networks themselves have made available, if you're in a firewall/no direct route situation. Their product does not cache (and I don't know of any software available that does.)

Some confusion arises because there is also a configuration option to use an HTTP proxy (such as Squid) with the Realaudio/RealVideo players. This is because the players can fetch the ``.ram'' file that contains the pnm: reference for the audio/video stream. They fetch that .ram file from an HTTP server, using HTTP.

7.5 Как мне удалить объект из кеша?

Squid не позволит удалить вам объект до тех пор, пока вы не настроите контроль доступа в squid.conf. Во-первых вам необходимо добавить следующее:

        acl PURGE method PURGE
        acl localhost src
        http_access allow PURGE localhost
        http_access deny PURGE
Указанное выше разрешает запросы удаления с локального хоста и запрещает все остальные запросы удаления.

Чтобы удалить объект воспользуйтесь программой client:

        client -m PURGE http://www.miscreant.com/
Если удаление прошло успешно вы увидите сообщение ``200 OK'':
        HTTP/1.0 200 OK
        Date: Thu, 17 Jul 1997 16:03:32 GMT
        Server: Squid/1.1.14
Если объект в кеше не найден вы получите сообщение ``404 Not Found'':
        HTTP/1.0 404 Not Found
        Date: Thu, 17 Jul 1997 16:03:22 GMT
        Server: Squid/1.1.14

7.6 Using ICMP to Measure the Network

As of version 1.1.9, Squid is able to utilize ICMP Round-Trip-Time (RTT) measurements to select the optimal location to forward a cache miss. Previously, cache misses would be forwarded to the parent cache which returned the first ICP reply message. These were logged with FIRST_PARENT_MISS in the access.log file. Now we can select the parent which is closest (RTT-wise) to the origin server.

Supporting ICMP in your Squid cache

It is more important that your parent caches enable the ICMP features. If you are acting as a parent, then you may want to enable ICMP on your cache. Also, if your cache makes RTT measurements, it will fetch objects directly if your cache is closer than any of the parents.

If you want your Squid cache to measure RTT's to origin servers, Squid must be compiled with the USE_ICMP option. This is easily accomplished by uncommenting "-DUSE_ICMP=1" in src/Makefile and/or src/Makefile.in.

An external program called pinger is responsible for sending and receiving ICMP packets. It must run with root privileges. After Squid has been compiled, the pinger program must be installed separately. A special Makefile target will install pinger with appropriate permissions.

        % make install
        % su
        # make install-pinger
There are three configuration file options for tuning the measurement database on your cache. netdb_low and netdb_high specify high and low water marks for keeping the database to a certain size (e.g. just like with the IP cache). The netdb_ttl option specifies the minimum rate for pinging a site. If netdb_ttl is set to 300 seconds (5 minutes) then an ICMP packet will not be sent to the same site more than once every five minutes. Note that a site is only pinged when an HTTP request for the site is received.

Another option, minimum_direct_hops can be used to try finding servers which are close to your cache. If the measured hop count to the origin server is less than or equal to minimum_direct_hops, the request will be forwarded directly to the origin server.

Utilizing your parents database

Your parent caches can be asked to include the RTT measurements in their ICP replies. To do this, you must enable query_icmp in your config file:

        query_icmp on
This causes a flag to be set in your outgoing ICP queries.

If your parent caches return ICMP RTT measurements then the eighth column of your access.log will have lines similar to:

In this case, it means that it.cache.nlanr.net returned the lowest RTT to the origin server. If your cache measured a lower RTT than any of the parents, the request will be logged with

Inspecting the database

The measurement database can be viewed from the cachemgr by selecting "Network Probe Database." Hostnames are aggregated into /24 networks. All measurements made are averaged over time. Measurements are made to specific hosts, taken from the URLs of HTTP requests. The recv and sent fields are the number of ICMP packets sent and received. At this time they are only informational.

A typical database entry looks something like this:

    Network          recv/sent     RTT  Hops Hostnames        20/  21    82.3   6.0 www.jisedu.org www.dozo.com
        bo.cache.nlanr.net        42.0   7.0
        uc.cache.nlanr.net        48.0  10.0
        pb.cache.nlanr.net        55.0  10.0
        it.cache.nlanr.net       185.0  13.0
This means we have sent 21 pings to both www.jisedu.org and www.dozo.com. The average RTT is 82.3 milliseconds. The next four lines show the measured values from our parent caches. Since bo.cache.nlanr.net has the lowest RTT, it would be selected as the location to forward a request for a www.jisedu.org or www.dozo.com URL.

7.7 Почему так мало запросов TCP_IMS_MISS попадают в лог?

Когда Squid получает запрос If-Modified-Since, то запрос не будет передан, пока объект не потребует обновления согласно правил refresh_pattern. Если запрос не требует обновления, он будет записан в лог как TCP_REFRESH_HIT или TCP_REFRESH_MISS.

Если запрос не передается, Squid отвечает на IMS-запрос согласно статусу объекта в его кеше. Если время модификации тоже самое, то Squid возвращает TCP_IMS_HIT. Если время модификации отличается, Squid возвращает TCP_IMS_MISS. В большинстве случаев закешированный объект не будет изменен, поэтому результат будет TCP_IMS_HIT. Squid вернет TCP_IMS_MISS только тогда, когда другой клиент получит более новую версию объекта, которая будет сохранена в кеше.

7.8 Как мне заставить Squid НЕ кешировать некоторые сервера или URL-ы?

В Squid-2 используйте опцию no_cache, чтобы указать некешируемые объекты. К примеру, следующее сделает все ответы серверов из сети некешируемыми:

        acl Local dst
        no_cache deny Local

Этот пример делает некешируемыми все URL-лы с '.html':

        acl HTML url_regex .html$
        no_cache deny HTML

Этот пример заставляет не кешироваться определенный URL:

        acl XYZZY url_regex ^http://www.i.suck.com/foo.html$
        no_cache deny XYZZY

В этом примере указано, что ничего не должно кешироваться с 8 до 11 утра:

        acl Morning time 08:00-11:00
        no_cache deny Morning

В Squid-1.1 за то, кешируется объект или нет отвечают опции cache_stoplist и cache_stoplist_pattern. Можете добавить к примеру:

        cache_stoplist my.domain.com
Указать некешируемый объект по IP-адресу труднее. На "1.1 patch page" лежит патч, называемый no-cache-local.patch, который изменяет действие local_ip и local_domain таким образом, что совпавшие запросы НЕ КЕШИРУЮТСЯ, вдобавок они скачиваются напрямую с сервера.

7.9 Как я могу удалить и вновь создать кеш?

Удалить существующую директорию кеша не так уж трудно. К сожалению, вы не можете просто изменить и squid.conf и заставить прокси его пречитать. Вы не можете прекратить использование cache_dir пока Squid запущен. Также имейте ввиду, что Squid требует хотя бы одной cache_dir для работы.

  1. Отредактируйте squid.conf, удалив или закоментировав сроку cache_dir для директории кеша, которую вы хотите удалить.
  2. Если вы не имете ни одной строки cache_dir в вашем squid.conf, то Squid-ом используется значение по умолчанию. Вам необходимо добавить новую строку cache_dir, т.к. Squid будет продолжать использовать значение по умолчанию. Вы можете добавить небольшую, временную директорию, к примеру:
    /usr/local/squid/cachetmp ....
    Если вы добавили новую cache_dir, вы должны запустить squid -z, чтобы ее инициализировать.
  3. Запомните, что вы не можете удалить директорию кеша, когда процесс Squid запущен; вы не можете просто презапустить squid. Вы должны его остановить:
            squid -k shutdown
  4. Когда Squid завершил работу, вы можете немедленно запустить его снова. Т.к. вы удалили старую cache_dir из squid.conf, Squid не будет пытаться получить к ней доступ. Если вы используете скрипт RunCache, Squid перезапустится автоматически.
  5. Теперь Squid больше не использует директорию кеша, которую вы удалил из файла конфигурации. Вы пожете проверить это, используя данные о "Store Directory" в вашем кеш-менеджере. В командной строке напечатайте:
            client mgr:storedir
  6. Т.к. Squid не использует директорию кеша , вы можете сделать rm -rf для нее, отформатировать диск, создать новую файловую систему лиюбо что-то еще.

Процедура, похожая на создание директории заново.

  1. Отредактируйте squid.conf и добавьте новую строку cache_dir.
  2. Инициализируйте новую директорию, запустив
            % squid -z
    Замечание: it is safe to run this even if Squid is already running. squid -z will harmlessly try to create all of the subdirectories that already exist.
  3. Перезапустите Squid
            squid -k reconfigure
    В отличие от удаления, вы можете добавить новую директорию, когда Squid уже запущен.

7.10 Почему я не могу запустить Squid как root?

от Dave J Woolley

Если кто-нибудь обнаруживает переполнение буфера в Squid, который запущен от пользователя отличного от root, тогда он может повредить только файлы, доступные для записи этому пользователю. Но если прокси запущен от root, то он может получить контроль над всей машиной. Это касается всех программ, которые совсем не нуждаются в рутовых привелегиях, а не только squid-а.

7.11 Можете ли вы подсказать мне хороший вариант обновления Squid с минимальными затратами времени?

Данная техника описана Radu Greab.

Запустите второй Squid на неиспользуемом HTTP-порту (скажем 4128). В том случае для Squid врядли потребуется большое кол-во дискового пространства под кеш. Когда второй сервер hen this second server has finished reloading the disk store, поменяйте значения http_port в двух файлах squid.conf. Укажите оригинальному Squid использовать порт 5138, а на второму - использовать порт 3128. Далее сделайте ``squid -k reconfigure'' для обоих Squid-ов. Новые запросы попадут второму Squid, который теперь работает на на порту 3128, а первый Squid прекратит поддерживать текущие запросы. Через несколько минут можно полностью остановить первый Squid и обновить его. Позже вы можете просто повторить этот процесс в обратной последовательности.

7.12 Может ли Squid слушать более одного HTTP-порта ?

Замечание: Информация, представленная здесь, верна для версии 2.3.

Да, вы можете указать несколько строк http_port в вашем squid.conf. Squid попытается сделать bind() к каждому указанному порту. Иногда Squid не может привязаться к порту либо по причине отсутствия прав,либо потому-что порт уже используется. Если Squid может слушаьт хотя бы одни порт, то он продолжит работать. Если он не сможет привязатся ни к одному порту, он прекратит работу.

В версии 2.3 и более поздних вы можете указывать IP-адрес и порт вместе (см. комментарии в squid.conf).

Вперед Назад Содержание