Рейтинг@Mail.ru
[Войти] [Зарегистрироваться]

Наши друзья и партнеры

UnixForum


Lines Club

Ищем достойных соперников.




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

Библиотека сайта или "Мой Linux Documentation Project"

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

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-max
So, 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

by Torsten Sturm

  1. How do I check my maximum filedescriptors?

    Do sysctl -a and look for the value of kern.maxfilesperproc.

  2. How do I increase them?
            sysctl -w kern.maxfiles=XXXX
            sysctl -w kern.maxfilesperproc=XXXX
    
    Warning: You probably want maxfiles > maxfilesperproc if you're going to be pushing the limit.
  3. 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):

  1. How do I check my maximum filedescriptors?

    Do pstat -T and look for the files value, typically expressed as the ratio of currentmaximum/.

  2. 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.

  3. 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.

Here are a few examples which should lead you in the right direction:
  1. SunOS

    Change the value of nfile in usr/kvm/sys/conf.common/param.c/tt> by altering this equation:

            int     nfile = 16 * (NPROC + 16 + MAXUSERS) / 10 + 64;
    
    Where NPROC is defined by:
            #define NPROC (10 + 16 * MAXUSERS)
    
  2. 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 the maxfiles and maxfilesperproc variables:

            int     maxfiles = NPROC*2;
            int     maxfilesperproc = NPROC*2;
    
    Where NPROC 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
  3. BSD/OS (from the 2.1 kernel)

    Edit /usr/src/sys/conf/param.c and adjust the maxfiles math here:

            int     maxfiles = 3 * (NPROC + MAXUSERS) + 80;
    
    Where NPROC is defined by: #define NPROC (20 + 16 * MAXUSERS) You should also set the OPEN_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-адрес ваш кеш не может определить. Это возможно в двух ситуациях.

  1. Если братский кеш расположен на машине с несколькими интерфейсами и посылает пакеты с интерфейса, не объявленного в 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
    

  2. Вы также можете увидеть подобное предупреждение, когда посылыаете 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:

  1. Make sure all members have the same refresh_rules parameters.
  2. 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.
If neither of these is realistic, then the sibling relationship should not exist.

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.

  1. 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.
  2. 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 unlimited
or
        limits coredump unlimited

Debugging Symbols: To see if your Squid binary has debugging symbols, use this command:

        % nm /usr/local/squid/bin/squid | head
The 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 CcAttrs
There are no debugging symbols if you see this instead:
        /usr/local/squid/bin/squid: no symbols
Debugging 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:

  1. The coredump_dir directory, if you set that option.
  2. The first cache_dir directory if you have used the cache_effective_user option.
  3. The current directory when Squid was started
Recent versions of Squid report their current directory after starting, so look there first:
        2000/03/14 00:12:36| Set Current Directory to /usr/local/squid/cache
If 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 не может отрезолвить эти имена, это может означать что:

  1. ваш сервер имен DNS недоступен или не запущен.
  2. ваш /etc/resolv.conf возможно содержит некорректную информацию.
  3. на ваш /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:

  1. You've found a Squid bug.
  2. 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 !PEERS
The 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.0
Then 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:

  1. DENY: The request is denied with an ``Invalid Request'' message. This is the default.
  2. ALLOW: The request is allowed and the URL remains unchanged.
  3. ENCODE: The whitespace characters are encoded according to RFC 1738. This can be considered a violation of the HTTP specification.
  4. 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 раньеш, то у вас три выхода:

  1. Присмотреться не подойте ли вам опция append_domain взамен этого.
  2. Сконфигурировать squid с опцией --disable-internal-dns, чтобы использовать внешний dnsservers.
  3. Просмотреть 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-файл, то есть два пути восстановить его.

  1. Запустите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
    
  2. Используйте описанную выше технику поиска 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 в вашем броузере, происходит одно из двух:

  1. Броузер устанавливает SSL-соединение напрямую с запрашиваемым сервером.
  2. Броузер пропускает запрос по туннелю через 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 или на страницу, посвященную этому.


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


Эта статья еще не оценивалась
Вы сможете оценить статью и оставить комментарий, если войдете или зарегистрируетесь.
Только зарегистрированные пользователи могут оценивать и комментировать статьи.

Комментарии отсутствуют