Библиотека сайта rus-linux.net
11. Решение проблем
11.1 Почему я получаю ``Proxy Access Denied?''
Возможно вам необходимо установить опцию http_access, чтобы разрешить запросы в вашего IP-адреса. Загляните в секцию Контроль доступа для более детальной информации.
Если squid работает в режиме httpd-акселератора, он будет принимать принятые обычные HTTP-запросы HTTP-серверу, но это не коснется запросов прокси. Если вы хотите, чтобы также принимал запросы proxy-HTTP, вы должны воспользоваться директивой:
httpd_accel_with_proxy onДругой причиной может быть неверно описанный вами ACL. Проверьте файлы access.log и squid.conf, чтобы найти причину.
11.2 Я не могу заставить работать local_domain
.Squidкеширует объекты с моих локальных серверов.
Директива local_domain
не предохраняет локальные объекты от
кеширования. Она предотвращает от использования сиблинга при получении локальных
объектов. Если вы хотите избежать кеширования локальных объектов, используйте
конфигурационные опции cache_stoplist
или http_stop
(в зависимости от версии).
11.3 I get Connection Refused
when the cache tries to retrieve an object located on a sibling, even though the sibling thinks it delivered the object to my cache.
If the HTTP port number is wrong but the ICP port is correct you
will send ICP queries correctly and the ICP replies will fool your
cache into thinking the configuration is correct but large objects
will fail since you don't have the correct HTTP port for the sibling
in your squid.conf file. If your sibling changed their
http_port
, you could have this problem for some time
before noticing.
11.4 Кончаются файловые дескрипторы.
Если вы видите сообщение о ошибке Too many open files
, то
скорее всего у вас закончились файловые дескрипторы. Возмозжно это вызвано тем,
что Squid запущен на ОС с небольшим лимитом файловых дескрипторов. Зачастую этот лимит
можно указать перестроив ядро или при помощи других отладочных инструментов системы.
Есть две причины по которым кончаются файловые дескрипторы: первая - вы возможно достигли
лимита файловых дескрипторов на отдельный процесс. Вторая - вы возможно достигли системного
лимита общего кол-ва файловых дескрипторов для всех процессов.
Linux
Dancer has a Mini-'Adding File-descriptors-to-linux for squid' HOWTO, but this information seems specific to the Linux 2.0.36 kernel.
Henrik has a How to get many filedescriptors on Linux 2.2.X page.
You also might want to have a look at filehandle patch by Michael O'Reilly
If your kernel version is 2.2.x or greater, you can read and write the maximum number of file handles and/or inodes simply by accessing the special files:
/proc/sys/fs/file-max /proc/sys/fs/inode-maxSo, to increase your file descriptor limit:
echo 3072 > /proc/sys/fs/file-max
If your kernel version is between 2.0.35 and 2.1.x (?), you can read and write the maximum number of file handles and/or inodes simply by accessing the special files:
/proc/sys/kernel/file-max /proc/sys/kernel/inode-max
While this does increase the current number of file descriptors, Squid's configure script probably won't figure out the new value unless you also update the include files, specifically the value of OPEN_MAX in /usr/include/linux/limits.h.
Solaris
Add the following to your /etc/system file to increase your maximum file descriptors per process:
set rlim_fd_max = 4096
Next you should re-run the configure script
in the top directory so that it finds the new value.
If it does not find the new limit, then you might try
editing include/autoconf.h and setting
#define DEFAULT_FD_SETSIZE
by hand. Note that
include/autoconf.h is created from autoconf.h.in
every time you run configure. Thus, if you edit it by
hand, you might lose your changes later on.
If you have a very old version of Squid (1.1.X), and you
want to use more than 1024 descriptors, then you must
edit src/Makefile and enable
$(USE_POLL_OPT)
. Then recompile squid.
Jens-S. Voeckler advises that you should NOT change the soft limit (rlim_fd_cur) to anything larger than 256. It will break other programs, such as the license manager needed for the SUN workshop compiler. Jens-S. also says that it should be safe to raise the limit as high as 16,384.
IRIX
For some hints, please see SGI's Tuning IRIX 6.2 for a Web Server document.
FreeBSD
- How do I check my maximum filedescriptors?
Do
sysctl -a
and look for the value ofkern.maxfilesperproc
. - How do I increase them?
sysctl -w kern.maxfiles=XXXX sysctl -w kern.maxfilesperproc=XXXX
Warning: You probably wantmaxfiles > maxfilesperproc
if you're going to be pushing the limit. - What is the upper limit?
I don't think there is a formal upper limit inside the kernel. All the data structures are dynamically allocated. In practice there might be unintended metaphenomena (kernel spending too much time searching tables, for example).
General BSD
For most BSD-derived systems (SunOS, 4.4BSD, OpenBSD, FreeBSD, NetBSD, BSD/OS, 386BSD, Ultrix) you can also use the ``brute force'' method to increase these values in the kernel (requires a kernel rebuild):
- How do I check my maximum filedescriptors?
Do
pstat -T
and look for thefiles
value, typically expressed as the ratio ofcurrent
maximum/. - How do I increase them the easy way?
One way is to increase the value of the
maxusers
variable in the kernel configuration file and build a new kernel. This method is quick and easy but also has the effect of increasing a wide variety of other variables that you may not need or want increased. - Is there a more precise method?
Another way is to find the param.c file in your kernel build area and change the arithmetic behind the relationship between
maxusers
and the maximum number of open files.
- SunOS
Change the value of
nfile
inusr/kvm/sys/conf.common/param.c/tt> by altering this equation:
int nfile = 16 * (NPROC + 16 + MAXUSERS) / 10 + 64;
WhereNPROC
is defined by:#define NPROC (10 + 16 * MAXUSERS)
- FreeBSD (from the 2.1.6 kernel)
Very similar to SunOS, edit /usr/src/sys/conf/param.c and alter the relationship between
maxusers
and themaxfiles
andmaxfilesperproc
variables:int maxfiles = NPROC*2; int maxfilesperproc = NPROC*2;
WhereNPROC
is defined by:#define NPROC (20 + 16 * MAXUSERS)
The per-process limit can also be adjusted directly in the kernel configuration file with the following directive:options OPEN_MAX=128
- BSD/OS (from the 2.1 kernel)
Edit
/usr/src/sys/conf/param.c
and adjust themaxfiles
math here:int maxfiles = 3 * (NPROC + MAXUSERS) + 80;
WhereNPROC
is defined by:#define NPROC (20 + 16 * MAXUSERS)
You should also set theOPEN_MAX
value in your kernel configuration file to change the per-process limit.
Reconfigure afterwards
NOTE: After you rebuild/reconfigure your kernel with more filedescriptors, you must then recompile Squid. Squid's configure script determines how many filedescriptors are available, so you must make sure the configure script runs again as well. For example:
cd squid-1.1.x make realclean ./configure --prefix=/usr/local/squid make
11.5 Что за странные строки о удалении объектов?
К примеру:
97/01/23 22:31:10| Removed 1 of 9 objects from bucket 3913 97/01/23 22:33:10| Removed 1 of 5 objects from bucket 4315 97/01/23 22:35:40| Removed 1 of 14 objects from bucket 6391
Это вполне нормально и говорит о том, что ваш squid достиг
границы cache_swap_high
.
Обратитесь к странице состояния вашего кеша при помощи cachemgr.cgi и найдите там примерно такую строку:
Storage LRU Expiration Age: 364.01 days
Объекты, которые не использовались такое кол-во времени удаляются согласно
политики обслуживания кеша. Вы можете установить значение верхнего лимита
LRU Expiration Age
при помощи reference_age
в
конфигурационном файле.
11.6 Могу ли заставить Windows NT FTP-сервер показывать директории в формате Unix?
Конечно можете ! Выберите следующие меню:
- Start
- Programs
- Microsoft Internet Server (Common)
- Internet Service Manager
Появится окно с различными иконками для ваших служб. Одна из них должна быть ввиде маленькой ``папки'' ftp. Дважды щелкните на ней.
Далее вам необходимо выбрать сервер (должен быть только один). Выберите его, затем перейдите к пункту ``Properties'' из меню и далее на вкладку ``directories''.
В нижней части вкладки будет опция, название которой - ``Directory listing style.'' Выберите тип ``Unix'' взамен типа ``MS-DOS''.
--Oskar Pearson <oskar@is.co.za>
11.7 Почему я получаю ``Ignoring MISS from non-peer x.x.x.x?''
Вы получаете ICP MISS (по UDP) от родительского или братского кеша, чей IP-адрес ваш кеш не может определить. Это возможно в двух ситуациях.
- Если братский кеш расположен на машине с несколькими интерфейсами и посылает
пакеты с интерфейса, не объявленного в DNS. К сожалению, это проблема настроек
на сайте братского кеша. Вы можете попросить добавить этот IP-адрес в их DNS или
использовать опцию "udp_outgoing_address", чтобы принудительно заставить Squid
отвечать с определенного интерфейса. К примеру:
в squid.conf вашего родительского кеша:
udp_outgoing_address proxy.parent.com
в вашем squid.conf:cache_host proxy.parent.com parent 3128 3130
- Вы также можете увидеть подобное предупреждение, когда посылыаете ICP-запросы на широковещательные адреса. По соображениям безопасности Squid требует от вас указания списка всех прочих кешей, слушающих групоовой широковещательный адрес. Если неизвестный кеш слушает этот адрес и посылает запросы, то ваш кеш сгенерирует сообщение о ошибке. Чтобы исправить ситуацию, либо укажите неизвестному кешу прекратить слушать широковещательный адрес, либо добавьте его в ваш конфигурационный файл, если этот кеш легитивен.
11.8 DNS lookups for domain names with underscores (_) always fail.
Стандарт именования хостов ( RFC 952, RFC 1101) не разрешает использовать знак подчеркивания в именах доменов:
"Имя" (Сети, Хоста, Шлюза или доменное имя) - текстовая строка до 24 символов, состоящая из символов английского алфавита (A-Z), цифр (0-9), знака минуса sign (-) и точки (.).Библиотека резолвера, идущая с последними версиями BIND, использует это органичение, возвращая сообщение о ошибке для каждого узла с знаком подчеркивания в имени хоста. Лучшее решение - пожаловаться хостмастеру "нехорошего" сайта и попросить его переименовать их хост.
Смотрите также comp.protocols.tcp-ip.domains FAQ.
Некоторые также заметили, что RFC 1033 подразумевате, что знак подчеркивания позволяется применять. Однако это информационный RFC с плохо подобраным примером, и это ни стандарт ни в коем случае.
11.9 Почему Squid сообщает: ``Illegal character in hostname; underscores are not allowed?'
См. предыдущий вопрос. Знак подчеркивания не применяется для имен хостов.
Нектороые DNS разрешают использование знака подчеркивания, посему нормально работаю с именами хостов, когда вы не используете Squid.
Чтобы заставить Squid разрешить использование знака подчеркивания в именях хостов, перезапустите скрипт configure с такой опцией:
% ./configure --enable-underscores ...и затем перекомпилировать:
% make clean % make
11.10 Why am I getting access denied from a sibling cache?
The answer to this is somewhat complicated, so please hold on. NOTE: most of this text is taken from ICP and the Squid Web Cache.
An ICP query does not include any parent or sibling designation,
so the receiver really has no indication of how the peer
cache is configured to use it. This issue becomes important
when a cache is willing to serve cache hits to anyone, but only
handle cache misses for its paying users or customers. In other
words, whether or not to allow the request depends on if the
result is a hit or a miss. To accomplish this,
Squid acquired the miss_access
feature
in October of 1996.
The necessity of ``miss access'' makes life a little bit complicated,
and not only because it was awkward to implement. Miss access
means that the ICP query reply must be an extremely accurate prediction
of the result of a subsequent HTTP request. Ascertaining
this result is actually very hard, if not impossible to
do, since the ICP request cannot convey the
full HTTP request.
Additionally, there are more types of HTTP request results than there
are for ICP. The ICP query reply will either be a hit or miss.
However, the HTTP request might result in a ``304 Not Modified
'' reply
sent from the origin server. Such a reply is not strictly a hit since the peer
needed to forward a conditional request to the source. At the same time,
its not strictly a miss either since the local object data is still valid,
and the Not-Modified reply is quite small.
One serious problem for cache hierarchies is mismatched freshness parameters. Consider a cache C using ``strict'' freshness parameters so its users get maximally current data. C has a sibling S with less strict freshness parameters. When an object is requested at C, C might find that S already has the object via an ICP query and ICP HIT response. C then retrieves the object from S.
In an HTTP/1.0 world, C (and C's client) will receive an object that was never subject to its local freshness rules. Neither HTTP/1.0 nor ICP provides any way to ask only for objects less than a certain age. If the retrieved object is stale by Cs rules, it will be removed from Cs cache, but it will subsequently be fetched from S so long as it remains fresh there. This configuration miscoupling problem is a significant deterrent to establishing both parent and sibling relationships.
HTTP/1.1 provides numerous request headers to specify freshness
requirements, which actually introduces
a different problem for cache hierarchies: ICP
still does not include any age information, neither in query nor
reply. So S may return an ICP HIT if its
copy of the object is fresh by its configuration
parameters, but the subsequent HTTP request may result
in a cache miss due to any
Cache-control:
headers originated by C or by
C's client. Situations now emerge where the ICP reply
no longer matches the HTTP request result.
In the end, the fundamental problem is that the ICP query does not provide enough information to accurately predict whether the HTTP request will be a hit or miss. In fact, the current ICP Internet Draft is very vague on this subject. What does ICP HIT really mean? Does it mean ``I know a little about that URL and have some copy of the object?'' Or does it mean ``I have a valid copy of that object and you are allowed to get it from me?''
So, what can be done about this problem? We really need to change ICP so that freshness parameters are included. Until that happens, the members of a cache hierarchy have only two options to totally eliminate the ``access denied'' messages from sibling caches:
- Make sure all members have the same
refresh_rules
parameters. - Do not use
miss_access
at all. Promise your sibling cache administrator that your cache is properly configured and that you will not abuse their generosity. The sibling cache administrator can check his log files to make sure you are keeping your word.
11.11 Cannot bind socket FD NN to *:8080 (125) Address already in use
Это значит, что другой процесс уже слушает порт 8080 (или тот, что вы используете). Это может значить, что процесс Squid уже запущен или это сделала другая программа. Чтобы порверить, используйте команду netstat:
netstat -naf inet | grep LISTENОна покажет вам все сокеты находящиеся в состоянии LISTEN. Можете также попробовать
netstat -naf inet | grep 8080Если вы обнаружили, что како-то процесс занял ваш порт, но неуверены, что это за процесс, то можете использовать отличную программу lsof. Она покажет вам каждого владельца открытого дескриптора файлов в вашей системе.
11.12 icpDetectClientClose: ERROR xxx.xxx.xxx.xxx: (32) Broken pipe
Это значит что клиентский сокет был закрыт клиентом до того как Squid закончил
пересылку данных в него. Squid определяет это, пытаясь получить от сокета
данные при помощи read(2)
. Если вызов read(2)
неудачен,
то Squid определяет, что сокет был закрыт. Обычно вызов read(2)
возвращает
ECONNRESET: Connection reset by peer и это НЕ фиксируется в логе. Любые другие
сообщения об ошибках (такие как EPIPE: Broken pipe) записываются в cache.log.
Посмотрите ``intro'' раздела 2 руководства по вашей Unix, чтобы получить список всех
сообщений об ошибках.
11.13 icpDetectClientClose: FD 135, 255 unexpected bytes
Это происходит по вине некоторых "кривых" Web-клиентов, которые пытаются использовать постоянные соединения. Squid-1.1 не поддерживает постоянные соединения.
11.14 Does Squid work with NTLM Authentication?
Version 2.5 will support Microsoft NTLM authentication. However, there are some limits on our support: We cannot proxy connections to a origin server that use NTLM authentication, but we can act as a web accelerator or proxy server and authenticate the client connection using NTLM.
We support NT4, Samba, and Windows 2000 Domain Controllers. For more information get squid 2.5 and run ./configure --help.
Why we cannot proxy NTLM even though we can use it. Quoting from summary at the end of the browser authentication section in this article:
In summary, Basic authentication does not require an implicit end-to-end state, and can therefore be used through a proxy server. Windows NT Challenge/Response authentication requires implicit end-to-end state and will not work through a proxy server.
Squid transparently passes the NTLM request and response headers between clients and servers. NTLM relies on a single end-end connection (possibly with men-in-the-middle, but a single connection every step of the way. This implies that for NTLM authentication to work at all with proxy caches, the proxy would need to tightly link the client-proxy and proxy-server links, as well as understand the state of the link at any one time. NTLM through a CONNECT might work, but we as far as we know that hasn't been implemented by anyone, and it would prevent the pages being cached - removing the value of the proxy.
NTLM authentication is carried entirely inside the HTTP protocol, but is different from Basic authentication in many ways.
- It is dependent on a stateful end-to-end connection which collides with RFC 2616 for proxy-servers to disjoin the client-proxy and proxy-server connections.
- It is only taking place once per connection, not per request. Once the connection is authenticated then all future requests on the same connection inherities the authentication. The connection must be reestablished to set up other authentication or re-identify the user.
The reasons why it is not implemented in Netscape is probably:
- It is very specific for the Windows platform
- It is not defined in any RFC or even internet draft.
- The protocol has several shortcomings, where the most apparent one is that it cannot be proxied.
- There exists an open internet standard which does mostly the same but without the shortcomings or platform dependencies: digest authentication.
11.15 Опция default parent не работает!
Это сообщение получено из squid-bugs:
Если у вас только один родительский кеш, сконфигурированный как:cache_host xxxx parent 3128 3130 no-query defaultничего не посылается к родительскому прокси ни UDP пакеты, ни TCP.
Простое добавление опции default к свойствам родительского кеша не принуждает все запросы проходить через него. Термин default возможно не совсем точно подобранное слово. Термин default в данном случае значит, что родительский прокси будет использоваться как последний источник. Если кеш может установить прямое соединение, то он одаст ему предпочтение перед роделем по умолчанию. Если вы хотите принудительно пропустить все запросы через ваш родительский прокси по умолчанию, используйте опцию never_direct:
acl all src 0.0.0.0/0.0.0.0 never_direct allow all
11.16 ``Hot Mail'' complains about: Intrusion Logged. Access denied.
``Hot Mail'' не больно дружественен по отношению к прокси и требует, чтобы все запросы приходили с одного IP-адреса. Вы можете исправить это, добавив в ваш squid.conf:
hierarchy_stoplist hotmail.com
11.17 Мой Squid становиться слишком медленным после того, как проработает некоторое время.
Скорее всего это из-за того, что Squid использует памяти больше, чем это должно быть для вашей системы. Когда процесс Squid разростается, it experiences a lot of paging. Это очень быстро приведет к снижению качества работы Squid. Использование памяти - это серьезная проблема. There are a number of things to consider.
Прежде всего проверьте, что отдает вам Cache Manager в разделе Info и обратите внимание эти две строки:
Number of HTTP requests received: 121104 Page faults with physical i/o: 16720Заметьте, что если ваша система не имеет функции getrusage(), то вы не увидите строки page faults.
Разделите число page faults на кол-во соединений. В данном случае это 16720/121104 = 0.14. В идеале это значение должно быть в пределах 0.0 - 0.1. Приемлемо также значение из диапазона 0.1 - 0.2 . Если больше, то вы возможно обнаружили почему Squid работает недопустимо медленно.
Если отношение слишком велико, товам необходимо сделать некторые изменения, чтобы уменьшить кол-во используемой Squid-ом памяти.
11.18 WARNING: Failed to start 'dnsserver'
Это означает промбелу с правами. А Squid userid имеет права на запуск программы dnsserver?
Вы также можете протестировать работу dnsserver из командной строки:
> echo oceana.nlanr.net | ./dnsserverЭто вернет примерно следующее:
$name oceana.nlanr.net $h_name oceana.nlanr.net $h_len 4 $ipcount 1 132.249.40.200 $aliascount 0 $ttl 82067 $end
11.19 Как послать отчет о ошибке в Squid
Bug reports for Squid should be sent to the squid-bugs alias. Any bug report must include
- Версию Squid
- Тип ваше ОС и ее версию
crashes and core dumps
There are two conditions under which squid will exit abnormally and generate a coredump. First, a SIGSEGV or SIGBUS signal will cause Squid to exit and dump core. Second, many functions include consistency checks. If one of those checks fail, Squid calls abort() to generate a core dump.
Many people report that Squid doesn't leave a coredump anywhere. This may be due to one of the following reasons:
- Resource Limits. The shell has limits on the size of a coredump file. You may need to increase the limit.
- sysctl options. On FreeBSD, you won't get a coredump from
programs that call setuid() and/or setgid() (like Squid sometimes does)
unless you enable this option:
# sysctl -w kern.sugid_coredump=1
- No debugging symbols. The Squid binary must have debugging symbols in order to get a meaningful coredump.
- Threads and Linux. On Linux, threaded applications do not generate core dumps. When you use --enable-async-io, it uses threads and you can't get a coredump.
- It did leave a coredump file, you just can't find it.
Resource Limits: These limits can usually be changed in shell scripts. The command to change the resource limits is usually either limit or limits. Sometimes it is a shell-builtin function, and sometimes it is a regular program. Also note that you can set resource limits in the /etc/login.conf file on FreeBSD and maybe other BSD systems.
To change the coredumpsize limit you might use a command like:
limit coredumpsize unlimitedor
limits coredump unlimited
Debugging Symbols: To see if your Squid binary has debugging symbols, use this command:
% nm /usr/local/squid/bin/squid | headThe binary has debugging symbols if you see gobbledegook like this:
0812abec B AS_tree_head 080a7540 D AclMatchedName 080a73fc D ActionTable 080908a4 r B_BYTES_STR 080908bc r B_GBYTES_STR 080908ac r B_KBYTES_STR 080908b4 r B_MBYTES_STR 080a7550 D Biggest_FD 08097c0c R CacheDigestHashFuncCount 08098f00 r CcAttrsThere are no debugging symbols if you see this instead:
/usr/local/squid/bin/squid: no symbolsDebugging symbols may have been removed by your install program. If you look at the squid binary from the source directory, then it might have the debugging symbols.
Coredump Location: The core dump file will be left in one of the following locations:
- The coredump_dir directory, if you set that option.
- The first cache_dir directory if you have used the cache_effective_user option.
- The current directory when Squid was started
2000/03/14 00:12:36| Set Current Directory to /usr/local/squid/cacheIf you cannot find a core file, then either Squid does not have permission to write in its current directory, or perhaps your shell limits (csh and clones) are preventing the core file from being written.
Often you can get a coredump if you run Squid from the command line like this:
% limit core un % /usr/local/squid/bin/squid -NCd1
Once you have located the core dump file, use a debugger such as dbx or gdb to generate a stack trace:
tirana-wessels squid/src 270% gdb squid /T2/Cache/core GDB is free software and you are welcome to distribute copies of it under certain conditions; type "show copying" to see the conditions. There is absolutely no warranty for GDB; type "show warranty" for details. GDB 4.15.1 (hppa1.0-hp-hpux10.10), Copyright 1995 Free Software Foundation, Inc... Core was generated by `squid'. Program terminated with signal 6, Aborted. [...] (gdb) where #0 0xc01277a8 in _kill () #1 0xc00b2944 in _raise () #2 0xc007bb08 in abort () #3 0x53f5c in __eprintf (string=0x7b037048 "", expression=0x5f <Address 0x5f out of bounds>, line=8, filename=0x6b <Address 0x6b out of bounds>) #4 0x29828 in fd_open (fd=10918, type=3221514150, desc=0x95e4 "HTTP Request") at fd.c:71 #5 0x24f40 in comm_accept (fd=2063838200, peer=0x7b0390b0, me=0x6b) at comm.c:574 #6 0x23874 in httpAccept (sock=33, notused=0xc00467a6) at client_side.c:1691 #7 0x25510 in comm_select_incoming () at comm.c:784 #8 0x25954 in comm_select (sec=29) at comm.c:1052 #9 0x3b04c in main (argc=1073745368, argv=0x40000dd8) at main.c:671
If possible, you might keep the coredump file around for a day or two. It is often helpful if we can ask you to send additional debugger output, such as the contents of some variables.
If you CANNOT get Squid to leave a core file for you then one of the following approaches can be used
First alternative is to start Squid under the contol of GDB
% gdb /path/to/squid handle SIGPIPE pass nostop noprint run -DNYCd3 [wait for crash] backtrace quit
The drawback from the above is that it isn't really suitable to run on a production system as Squid then won't restart automatically if it crashes. The good news is that it is fully possible to automate the process above to automatically get the stack trace and then restart Squid. Here is a short automated script that should work:
#!/bin/sh trap "rm -f $$.gdb" 0 cat <<EOF >$$.gdb handle SIGPIPE pass nostop noprint run -DNYCd3 backtrace quit EOF while sleep 2; do gdb -x $$.gdb /path/to/squid 2>&1 | tee -a squid.out done
Other options if the above cannot be done is to:
a) Build Squid with the --enable-stacktraces option, if support exists for your OS (exists for Linux glibc on Intel, and Solaris with some extra libraries..)
b) Run Squid using the "catchsegv" tool. (Linux glibc Intel)
but these approaches does not by far provide as much details as using gdb.
11.20 Отладка Squid
Если вы уверены, что нашли нефатальный (типа некорректной обработки HTTP), пожалуйста пошлите нам кусок вашего cache.log с отладочной информацией, которая описывает проблему. Файл cache.log может быть очень большим, поэтому вы можете скопировать его на FTP или HTTP-сервер, откуда мы сможем его загрузить.
Достаточно просто включить полную отладку для запущенного процесса Squid. Просто используйте ключ -k debug в строке запуска:
% ./squid -k debugПри этом каждый объявленны debug() в исходном коде будет заноситьь строку в файл cache.log. Вы также можете использовать ту же команду, чтобы вернуть Squid в нормальный режим работы.
Чтобы включить выборочную отладку (т.е. только для одного файла из исходных текстов), вам необходимо отредактировать файл squid.conf и добавить опцию debug_options. Каждый исходник Squid привязан к определенной отладочной секции. Секцию отладки, к которой относится данный файл, вы можете найти прямо в начале этого, или почитав файл doc/debug-levels.txt (для Squid-2 он переименован в debug-sections.txt for Squid-2). Вы также указываете уровень отладки, чтобы проконтролировать кол-во отладочной информации. Более высокий уровень дает большее кол-во отладочной информации. К примеру, чтобы включить полную отладку для секции Access Control, вам необходимо указать:
debug_options ALL,1 28,9Теперь вам необходимо перезапустить Squid или сделать ему reconfigure.
Если вы видите отладочную информацию в вашем cache.log, можете самостоятельно попытаться определить, что стало причиной наблюдаемого вами поведения . Если не получается, то свободно посылайте отладочную информацию в список рассылки squid-users или squid-bugs.
11.21 FATAL: ipcache_init: DNS name lookup tests failed
Squid обычно тестирует конфигурацию DNS вашей системы перед тем как начать принимать запросы. Squid пытается отрезолвить несколько имен DNS, которые указаны в директиве dns_testnames файла конфигурации. Если Squid не может отрезолвить эти имена, это может означать что:
- ваш сервер имен DNS недоступен или не запущен.
- ваш /etc/resolv.conf возможно содержит некорректную информацию.
- на ваш /etc/resolv.conf указаны неверные права и он недоступен для Squid.
Чтобы выключить тест, используйте ключ -D в строке запуска.
Заметьте, что Squid НЕ использует dnsservers для теста DNS. Тест выполняяется внутренним процессом до запуска dnsservers.
11.22 FATAL: Failed to make swap directory /var/spool/cache: (13) Permission denied
Начиная с версии 1.1.15, мы требуем, чтобы вы прежде всего сделали
squid -zчтобы создать swap-директории на вашей файловой системе. Если вы установили опцию cache_effective_user, то процесс Squid получает заданный userid перед тем, как создавать директории. Если директория cache_dir (к примеру /var/spool/cache) не сущестует и Squid userid не имеет прав, чтобы создать ее, то вы получите сообщение ``permission denied''(доступ запрещен). Это может быть очень просто исправлено - создайте директорию кеша вручную.
# mkdir /var/spool/cache # chown <userid> <groupid> /var/spool/cache # squid -z
Другой вариант, когда директория существует и ваша ОС может вернуть ``Permission Denied'' взамен ``File Exists'' при системном вызове mkdir(). Этот patch (store.c-mkdir.patch) от Miquel van Smoorenburg должен исправить эту ошибку.
11.23 FATAL: Cannot open HTTP Port
Либо Squid userid не имеет прав чтобы привязаться к порту, либо другой процесс уже связан с этим портом. Помните, что требуются привилегии root, чтобы открыть порт с номером неньше 1024. Если вы увидите это сообщение при использовании непривелигированного порта или при запуске Squid от root, то порт уже используется другим процессом. Возможно вы запустили прокси в режиме HTTP-акселератора, а ваш HTTP-сервер запущен на 80-м порту? Если вы озадачены, то установите утилиту lsof, чтобы узнать какой процесс использует ваш порт.
11.24 FATAL: All redirectors have exited!
Пояснения см. в секции Редиректоры.
11.25 FATAL: file_map_allocate: Exceeded filemap limit
См. следующий вопрос.
11.26 FATAL: You've run out of swap file numbers.
Note: The information here applies to version 2.2 and earlier.
Squid keeps an in-memory bitmap of disk files that are available for use, or are being used. The size of this bitmap is determined at run name, based on two things: the size of your cache, and the average (mean) cache object size.
The size of your cache is specified in squid.conf, on the cache_dir lines. The mean object size can also be specified in squid.conf, with the 'store_avg_object_size' directive. By default, Squid uses 13 Kbytes as the average size.
When allocating the bitmaps, Squid allocates this many bits:
2 * cache_size / store_avg_object_size
So, if you exactly specify the correct average object size, Squid should have 50% filemap bits free when the cache is full. You can see how many filemap bits are being used by looking at the 'storedir' cache manager page. It looks like this:
Store Directory #0: /usr/local/squid/cache First level subdirectories: 4 Second level subdirectories: 4 Maximum Size: 1024000 KB Current Size: 924837 KB Percent Used: 90.32% Filemap bits in use: 77308 of 157538 (49%) Flags:
Now, if you see the ``You've run out of swap file numbers'' message, then it means one of two things:
- You've found a Squid bug.
- Your cache's average file size is much smaller than the 'store_avg_object_size' value.
To check the average file size of object currently in your cache, look at the cache manager 'info' page, and you will find a line like:
Mean Object Size: 11.96 KB
To make the warning message go away, set 'store_avg_object_size' to that value (or lower) and then restart Squid.
11.27 I am using up over 95% of the filemap bits?!!
Замечание: информация, представленная здесь, верна для версии 2.3
Успокойтесь, это нормально. Squid now dynamically allocates filemap bits, основываясь на количестве объектов в кеше. Мы обещаем, что они у вас не смогут закончиться.
11.28 FATAL: Cannot open /usr/local/squid/logs/access.log: (13) Permission denied
В Unix, вещи типа процессов и файлов принадлежат владельцу. Для Squid владелец процесса и владелец файла должны быть одинаковы. Если они различны, то вы можете получить сообщение типа ``permission denied.''
Чтобы определить владельца файла, используйте команду ls -l:
% ls -l /usr/local/squid/logs/access.log
Процесс обычно принадлежит пользователю, который запустил его. Однако иногда Unix позволяет процессу изменять владельца. Если вы указали значение для опции effective_user в squid.conf, то это и будет владелец процесса. Владелец файлов должен быть тот же.
Если вас все это смущает, то возможно вам не стоит запускать Squid пока вы глубже не изучите Unix. Я рекомендую Learning the UNIX Operating System, 4th Edition.
11.29 Когда я использую имя пользователя и пароль, я не имею доступа к некоторым файлам.
Когда я пытаюсь получить доступ к
ftp://username:password@ftpserver/somewhere/foo.tar.gzЯ получаю
somewhere/foo.tar.gz: Not a directory.
Используйте такой URL вместо этого:
ftp://username:password@ftpserver/%2fsomewhere/foo.tar.gz
11.30 pingerOpen: icmp_sock: (13) Permission denied
Это значит, что ваша программа pinger не имеет рутовых привелегий. Вам необходимо делать следующее:
% su # make install-pingerили
# chown root /usr/local/squid/bin/pinger # chmod 4755 /usr/local/squid/bin/pinger
11.31 What is a forwarding loop?
A forwarding loop is when a request passes through one proxy more than once. You can get a forwarding loop if
- a cache forwards requests to itself. This might happen with transparent caching (or server acceleration) configurations.
- a pair or group of caches forward requests to each other. This can happen when Squid uses ICP, Cache Digests, or the ICMP RTT database to select a next-hop cache.
Forwarding loops are detected by examining the Via request header. Each cache which "touches" a request must add its hostname to the Via header. If a cache notices its own hostname in this header for an incoming request, it knows there is a forwarding loop somewhere.
NOTE: Squid may report a forwarding loop if a request goes through two caches that have the same visible_hostname value. If you want to have multiple machines with the same visible_hostname then you must give each machine a different unique_hostname so that forwarding loops are correctly detected.
When Squid detects a forwarding loop, it is logged to the cache.log file with the recieved Via header. From this header you can determine which cache (the last in the list) forwarded the request to you.
One way to reduce forwarding loops is to change a parent relationship to a sibling relationship.
Another way is to use cache_peer_access rules. For example:
# Our parent caches cache_peer A.example.com parent 3128 3130 cache_peer B.example.com parent 3128 3130 cache_peer C.example.com parent 3128 3130 # An ACL list acl PEERS src A.example.com acl PEERS src B.example.com acl PEERS src C.example.com # Prevent forwarding loops cache_peer_access A.example.com allow !PEERS cache_peer_access B.example.com allow !PEERS cache_peer_access C.example.com allow !PEERSThe above configuration instructs squid to NOT forward a request to parents A, B, or C when a request is received from any one of those caches.
11.32 accept failure: (71) Protocol error
Это сообщение в основном характерно для систем Solaris. Mark Kennedy дает хорошее пояснение этому:
Error 71 [EPROTO] - неявный способ сообщить, что сервер получил запрос от клиента на входящее TCP-соединение, но клиент разорвал соединение до того, как сервер смог принять его. Т.е. ваш сервер игнорировал клиентов слишком долго. Мы наблюдали подобное, когда у нас кончались файловые дескрипторы. Я предполагаю, что это также может случится, если заблокирован squid по какой-то причине ждлительное время.
11.33 storeSwapInFileOpened: ... Size mismatch
Получил подобное сообщение в моем cache.log. Я полагаю, что это значит, что содержимое индекса не совпадает с содержимым на диске.
1998/09/23 09:31:30| storeSwapInFileOpened: /var/cache/00/00/00000015: Size mismatch: 776(fstat) != 3785(object) 1998/09/23 09:31:31| storeSwapInFileOpened: /var/cache/00/00/00000017: Size mismatch: 2571(fstat) != 4159(object)
Что делает Squid в этом случае?
ЗАМЕТЬТЕ, что это сообщение специфично для Squid-2. Это случается, когда Squid читает объект для хита. После открытия файла Squid проверяет совпадает ли ожидаемый им размер с тем? что ест ьна самом деле. Если размер не совпадает, то генерируется сообщение о ошибке. В этом случае Squid не посылает поврежденный объект клиенту. Он получит объект заново из источника.
11.34 Why do I get fwdDispatch: Cannot retrieve 'https://www.buy.com/corp/ordertracking.asp'
These messages are caused by buggy clients, mostly Netscape Navigator. What happens is, Netscape sends an HTTPS/SSL request over a persistent HTTP connection. Normally, when Squid gets an SSL request, it looks like this:
CONNECT www.buy.com:443 HTTP/1.0Then Squid opens a TCP connection to the destination host and port, and the real request is sent encrypted over this connection. Thats the whole point of SSL, that all of the information must be sent encrypted.
With this client bug, however, Squid receives a request like this:
GET https://www.buy.com/corp/ordertracking.asp HTTP/1.0 Accept: */* User-agent: Netscape ... ...Now, all of the headers, and the message body have been sent, unencrypted to Squid. There is no way for Squid to somehow turn this into an SSL request. The only thing we can do is return the error message.
Note, this browser bug does represent a security risk because the browser is sending sensitive information unencrypted over the network.
11.35 Squid не может получить URL-ы типа http://3626046468/ab2/cybercards/moreinfo.html
by Dave J Woolley (DJW at bts dot co dot uk)
These are illegal URLs, generally only used by illegal sites; typically the web site that supports a spammer and is expected to survive a few hours longer than the spamming account.
Their intention is to:
- confuse content filtering rules on proxies, and possibly some browsers' idea of whether they are trusted sites on the local intranet;
- confuse whois (?);
- make people think they are not IP addresses and unknown domain names, in an attempt to stop them trying to locate and complain to the ISP.
Any browser or proxy that works with them should be considered a security risk.
RFC 1738 has this to say about the hostname part of a URL:
The fully qualified domain name of a network host, or its IP address as a set of four decimal digit groups separated by ".". Fully qualified domain names take the form as described in Section 3.5 of RFC 1034 [13] and Section 2.1 of RFC 1123 [5]: a sequence of domain labels separated by ".", each domain label starting and ending with an alphanumerical character and possibly also containing "-" characters. The rightmost domain label will never start with a digit, though, which syntactically distinguishes all domain names from the IP addresses.
11.36 I get a lot of ``URI has whitespace'' error messages in my cache log, what should I do?
Whitespace characters (space, tab, newline, carriage return) are not allowed in URI's and URL's. Unfortunately, a number of Web services generate URL's with whitespace. Of course your favorite browser silently accomodates these bad URL's. The servers (or people) that generate these URL's are in violation of Internet standards. The whitespace characters should be encoded.
If you want Squid to accept URL's with whitespace, you have to decide how to handle them. There are four choices that you can set with the uri_whitespace option:
- DENY: The request is denied with an ``Invalid Request'' message. This is the default.
- ALLOW: The request is allowed and the URL remains unchanged.
- ENCODE: The whitespace characters are encoded according to RFC 1738. This can be considered a violation of the HTTP specification.
- CHOP: The URL is chopped at the first whitespace character and then processed normally. This also can be considered a violation of HTTP.
11.37 commBind: Cannot bind socket FD 5 to 127.0.0.1:0: (49) Can't assign requested address
Это скорее всего значит, что ваша система не имеет сетевого устройства обратной петли или устройство неправильно настроено. Все Unix-системы должны иметь сетевое устройство, называемое lo0, и для него должен быть указан адрес 127.0.0.1. Если такого нет, то вы можете получить сообщение о ошибке, указанное выше. Чтобы проверить вашу систему, запустите:
% ifconfig lo0Результатом должно быть нечто подобное:
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384 inet 127.0.0.1 netmask 0xff000000
Если вы используете FreeBSD, загляните сюда.
11.38 Unknown cache_dir type '/var/squid/cache'
Формат опции cache_dir был изменен в версии 2.3. Теперь необходим аргумент type.
Все что нужно - вставить ufs
в строку, типа:
cache_dir ufs /var/squid/cache ...
11.39 unrecognized: 'cache_dns_program /usr/local/squid/bin/dnsserver'
Squid 2.3 по умолчанию ипользует встроенный DNS. В этом случае опции cache_dns_program и dns_children выглядят как неизвестные директивы в squid.conf. Просто закоментируйте эти два параметра.
Если вы желаете использовать внешний DNS вместе программной dnsserver, при конфигурировании добавьте такой ключ:
--disable-internal-dns
11.40 Is dns_defnames broken in 2.3.STABLE1 and STABLE2?
Начиная с версии Squid 2.3, по умолчанию используется встроенный в код DNS. Опция dns_defnames используется только для внешнего процесса dnsserver. Если вы пытались испоьзовать dns_defnames раньеш, то у вас три выхода:
- Присмотреться не подойте ли вам опция append_domain взамен этого.
- Сконфигурировать squid с опцией --disable-internal-dns, чтобы использовать внешний dnsservers.
- Просмотреть src/dns_internal.c чтобы понять для чекго нужны строки
search
иdomain
в файле /etc/resolv.conf.
11.41 What does sslReadClient: FD 14: read failure: (104) Connection reset by peer mean?
``Connection reset by peer'' - это сообщение о ошибке, которое иногда возвращает операционная система Unix для read, write, connect и других системных вызовов.
Connection reset значит, что удаленных хост, братский кеш к примеру, послал пакет RESET для TCP-соединения. Хост посылает RESET, когда получает неожидавшийся пакет для несуществующего соединения. К примеру, если одна сторона посылает данные в тот же момент, когда другая строна закрыла соединение, тогда получившая пакет сторона может в ответ послать RESET.
Факт, что подобное сообщение появилось в логе Squid может означать проблему соединения с родительским кешем или запрашиваемым хостом. С другой стороны это может быть и ``нормой'', особенно если учесть, что некоторые приложения принудительно посылают reset прежде чем нормально завершить соединение.
Возможно вам не стоит беспокоится об этом, пока вы не увидите большого кол-ва подобных сообщений при работе с SSL-сайтами.
Rick Jones подметил, что если сервер работает через стек Microsoft TCP stack, то клиент получает сегмент RST, когда переполняется очередь на порту, ожидающем соединения. Другими словами, если сервер действительно занят, то новые соединения получат сообщение reset. Это не рационально, но изменению не подлежит.
11.42 Что значит Connection refused?
Это сообщение о ошибке сгенерировано вашей операционной системой в ответ на системный вызов connect(). Это случается, когда с другой стороны нет сервера, слушающего порт, с которому мы пытаемся соедениться.
Вы вполне можете сгенерировать такое сообщение о ошибке самостоятельно. Просто подключитесь телнетом к любому произвольному несистемному порту :
% telnet localhost 12345 Trying 127.0.0.1... telnet: Unable to connect to remote host: Connection refusedЭто произошло потому-что не было сервиса, ожидающего соединения на порту 12345.
Когда вы видите подобное в ответ на запрос URL, это возможно означает, что веб-сайт на удаленном сервере временно не работает. Это также может значить, что ваш родительский кеш не работает, если вы его имеете конечно.
11.43 squid: ERROR: no running copy
В╕ можете получить подобное сообщение, когда делатет, к примеру
squid -krotate
.
╢то сообщение о ошибке об╕чно означает, что файл squid.pid поврежден. PID-файл об╕чно присутствует, когда squid запущен, его отсутствие обычно означает, что Squid не запущен. Если вы принудительно удалите PID-файл, то Squid продолжить работать, но вы не сможете послать ему какой-либо сигнал.
Если вы удалили PID-файл, то есть два пути восстановить его.
- Запустите
ps
и найдите id процесса Squid. Возможно вы увидите два процесса, нечто подобное:bender-wessels % ps ax | grep squid 83617 ?? Ss 0:00.00 squid -s 83619 ?? S 0:00.48 (squid) -s (squid)
Вам необходим второй id процесса, 83619 в данном случае. Создайте PID-файл и запишите в него id процесса. К примеру:echo 83619 > /usr/local/squid/logs/squid.pid
- Используйте описанную выше технику поиска id процесса Squid. Пошлите
процессу сигнал HUP, тоже самое что и
squid -k reconfigure
:kill -HUP 83619
Перезапущенный процесс создаст новый PID-файл автоматически.
11.44 FATAL: getgrnam failed to find groupid for effective group 'nogroup'
Возмоно вы запустили Squid от root. Squid пытается найти id группы, которая не имеет никаких ососбых привелегий, под которыми она запущен. По умолчанию это nogroup, но это может быть и не установлено на вашей ОС. Вам необходимо отредактировать squid.conf и указать в cache_effective_group имя непривелигированной группы из /etc/group. К примеру хорошим выбором для вас может статьnobody.
11.45 ``Unsupported Request Method and Protocol'' for https URLs.
Примечание: Информация, представленная здесь верна для версии 2.3.
Все верно. Squid не знает что делать с URL типа https. Чтобы обрабатывать подобные URL, Squid должен был бы поддерживать протокол SSL. К сожалению он этого не умеет (пока).
Обычно, когда вы набираете URL типа https в вашем броузере, происходит одно из двух:
- Броузер устанавливает SSL-соединение напрямую с запрашиваемым сервером.
- Броузер пропускает запрос по туннелю через Squid при помощи метода CONNECT.
Метод CONNECT - это возможность тунелировать любой тип соединения через HTTP-прокси. Прокси не разбарает и не интерпритирует содержимое. Он просто пропускает данные в обе стороны между клиентом и сервером. Для детального описания тунелирования и метода CONNECT, см. RFC 2817 and Tunneling TCP based protocols through Web proxy servers (expired).
11.46 Squid использует 100% CPU
Это происходит по многим причинам.
Андрей Дорошенко сообщает, что удаление /dev/null, или монитрование файловой системы с опцией nodev может быть причиной того, что Squid использует 100% CPU. Предложенное им решение - ``touch /dev/null.''
11.47 Webmin's cachemgr.cgi убивает операционную систему
Mikael Andersson сообщает, что если кликнуть на ссылке cachemgr.cgi в Webmin, то запускаетя большое кол-во копий cachemgr.cgi, что быстро съедает все доступную память и опускает систему.
Joe Cooper сообщает, что это происходитиз-за проблем с обработкой SSL в некоторых броузерах (в основном Netscape 6.x/Mozilla), если ваш Webmin использует SSL. Попробуйте другой броузер типа Netscape 4.x или Microsoft IE, или выключите SSL в Webmin.
11.48 Segment Violation во время запуска или при первом запросе
Некоторые версии GCC (от 2.95.1 до 2.95.3) имеют ошибку с потимизацией в компиляторе. Этот GCC может быть причиной указателя доступа NULL в Squid, в результате чего появляется сообщение ``FATAL: Received Segment Violation...dying'' и происходит core dump.
Вы можете избавится от этой ошибки GCC, если выключите оптимизацию компилятора. Лучший путь сделать это - взять чистое дерево исходников и установить такие опции CC:
% cd squid-x.y % make distclean % setenv CFLAGS='-g -Wall' % ./configure ...
Чтобы проверить, что все сделано верно, вы можете найти AC_CFLAGS в src/Makefile:
% grep AC_CFLAGS src/Makefile AC_CFLAGS = -g -WallПосле перекомпиляции GCC не будет пытаться оптимизировать что-либо:
% make Making all in lib... gcc -g -Wall -I../include -I../include -c rfc1123.c ...etc...
ПРИМЕЧАНИЕ: некторые беспокоятся, что выключение оптимизации в компиляторе негативно скажется на качестве работы Squid. Ухудшение должно ыть незначительным, пока ващ кен действительно не будет сильно загружен и не будет использовать много ресурсов CPU. Для большинства людей различие будет невелико или незаметно вовсе.
11.49 urlParse: Illegal character in hostname 'proxy.mydomain.com:8080proxy.mydomain.com'
От Yomler из fnac.net
Комбинация неверной настройки Internet Explorer и любых приложений, использующих cydoor DLLs будут отражены в логе. См. cydoor.com for a complete list.
Неверная конфигурация IE, когда используется настроечный скрипт (proxy.pac) и в активно и в неактивном режиме, очень чувствительна к настройкам прокси. IE будет использоват только proxy.pac. Приложения Cydoor используют оба метода, что и вызывает ошибку.
Отключение старых настроек прокси в IE недостаточно, вы должны удалить их полностью и использовать только proxy.pac, к примеру.
11.50 Не работают запросы для инетрнациональных доменных имен
от Henrik NordstrЖm
Некторые люди интересуются, почему запросы для доменных имен, использующих национальные символы и "поддерижваемые" некоторыми регистраторами доменов, не работают в Squid. Все потому, что пока еще нет стандарта о том как осуществлять управление еациональными символами в текущих реализациях протоколов Internet типа HTTP или DNS. В текущих стандартах Internet жестко указано, что приемлемо использовать для имен хостов - возможны только символы "A-Z a-z 0-9" и "-" для именования хостов Internet. Все остальное не относится к текущим стандартам Internet и может вызывать проблемы взаимодействия типа таких как мы наблюдает при обработке таких имен Squid-м.
Когда будет достигнуто соглашение между группами стандартизации DNS и HTTP о том, как поддерживать медународные доменные имена, код Squid будет изменен, чтобы поддерживать это, если зименения потребуются конечно.
Если вы интересуетесь развитием процесса стандартизации инетнациональных доменных имен, загляните на сайт рабочей группы IETF idn или на страницу, посвященную этому.
Вперед Назад Содержание