Re: ngx_http_limit_conn_module: жучок при ограничении соединений?

Dmitry Dedukhin dedukhin на mail.ru
Пт Дек 23 12:39:12 UTC 2011


23.12.2011 16:23, Maxim Dounin пишет:
> Hello!
>
> On Fri, Dec 23, 2011 at 10:16:29AM +0400, Dmitry Dedukhin wrote:
>
>> Добрый день.
>>
>> CentOS 5.
>>
>> /usr/sbin/nginx -V
>>
>> nginx: nginx version: nginx/1.0.9
>> nginx: built by gcc 4.1.2 20080704 (Red Hat 4.1.2-46)
>> nginx: TLS SNI support disabled
>> nginx: configure arguments: --prefix= --with-poll_module
>> --conf-path=/etc/nginx/nginx.conf --sbin-path=/usr/sbin
>> --error-log-path=/var/log/nginx/nginx.error.log
>> --http-log-path=/var/log/nginx/nginx.log
>> --http-client-body-temp-path=/var/spool/nginx/tmp/client
>> --http-proxy-temp-path=/var/spool/nginx/tmp/proxy
>> --http-fastcgi-temp-path=/var/spool/nginx/tmp/fastcgi
>> --pid-path=/var/run/nginx.pid --user=mail --group=mail
>> --with-http_ssl_module --with-select_module --with-poll_module
>> --with-http_ssl_module --with-md5=YES --with-http_realip_module
>> --with-http_stub_status_module --with-http_sub_module
>> --with-http_addition_module --with-http_dav_module
>> --add-module=./vkholodkov-nginx-upload-module-8d271b1
>> --add-module=./evanmiller-mod_zip-2657fc8
>> --add-module=./vkholodkov-nginx-eval-module-125fa2e
>>
>> Кусочек конфига:
>>
>> limit_zone   dnl  $binary_remote_addr  5m;
>> location /d2/ {
>>      ...
>>      limit_conn  dnl 3;
>>      ...
>> }
>>
>> Аптайм nginx'а около месяца:
>>
>> Active connections: 1728
>> server accepts handled requests
>>   12730717 12730717 12684554
>> Reading: 28 Writing: 1700 Waiting: 0
>>
>> Несмотря на заданное в конфиге ограничение в 3 соединения, по
>> крайней мере для одного IP-адреса nginx позволяет только 1
>> соединение, если больше - возвращает 503 ошибку.
>> Вполне вероятно, что неверное ограничение может действовать и на ряд
>> других IP-адресов, в то время как для большей части ограничение
>> работает корректно.
>>
>> С чем это может быть связано и куда копать?
>> Может ли это быть связано с коллизиями crc32 ?
>> Может ли при каких-то условиях "залипнуть" счетчик lz->conn ?
>> Например, не произошел вызов функции ngx_http_limit_zone_cleanup и,
>> соответственно, декрементирование счетчика, либо наоборот, произошел
>> "лишний" вызов ngx_http_limit_zone_cleanup и счетчик стал равен
>> максимальному u_short ?
>>
>> PS: nginx на этом сервере пока не рестартован, поэтому могу что-то
>> посмотреть, прицепившись через gdb
> grep -f '[alert]' /path/to/error/logs
>
> Скорее всего за прошедший месяц рабочие процессы падали и/или их
> некорректно убивали, в результате в зоне не были уменьшены
> счётчики соединений.
>
> Очистить счётчики можно с помощью процедуры обновления
> исполняемого файла на лету.

В логе куча записей вида:

2011/12/23 00:00:41 [error] 2734#0: *22996338 limiting connections by 
zone "dnl" while sending to client ...

может что-то конкретное надо искать?

Кстати, почему директива limit_conn_log_level warn; не подавляет эти 
записи в еррор-логе? Или я не так понял её?

error_log /path/to/error.log error;
server {
   ...
   limit_conn_log_level warn;
   location /d2/ {
     ...
     limit_conn  dnl 3;
     ...
   }
}



Подробная информация о списке рассылки nginx-ru