Re: ngx_http_limit_conn_module: жучок при ограничении соединений?
Maxim Dounin
mdounin на mdounin.ru
Пт Дек 23 12:23:37 UTC 2011
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
Скорее всего за прошедший месяц рабочие процессы падали и/или их
некорректно убивали, в результате в зоне не были уменьшены
счётчики соединений.
Очистить счётчики можно с помощью процедуры обновления
исполняемого файла на лету.
Maxim Dounin
Подробная информация о списке рассылки nginx-ru