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

Dmitry Dedukhin dedukhin на mail.ru
Пт Дек 23 06:16:29 UTC 2011


Добрый день.

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



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