Hello! On Fri, Apr 17, 2015 at 06:06:49AM -0400, dwow wrote:
> Добрый день. > > Была задача ограничить кол-во запросов к бэкенду. Например, чтобы > одновременно не поступало более 1 запроса. Остальные запросы, пока работает > бэкенд, могли отваливаться по ошибке, это не страшно. > С помощью Perl я устанавливал переменную, которая показывала идет ли запрос > для проксирования на бэкенд или нет. И эту переменную использовал в качестве > ключа для > http://nginx.org/ru/docs/http/ngx_http_limit_conn_module.html#limit_conn_zone > > perl_set $service_hit ' > sub { > my $r = shift; > if($r->uri =~ m|^/services/post|){ > return "services"; > } else { > return ""; > } > } > '; > limit_conn_zone "$service_hit" zone=perservice:10m; Just a side note: не надо делать так, вместо этого правильно написать отдельный location, в котором и задать ограничение. > Потом перед проксированием на бэкенд (в location) использовал ограничениие > http://nginx.org/ru/docs/http/ngx_http_limit_conn_module.html#limit_conn > > limit_conn perservice 1; > > Все отлично работает, но только первые 30-60 минут, потом nginx для всех > запросов возвращает 503 ошибку, т.е. счетчик не сбрасывается. Если > остановить-запустить nginx, то опять какое-то время все работает корректно. > В чем может быть проблема? Скорее всего проблема в том, что limit_conn органичивает не соединения на бекенду, а активные соединения. Соответственно, если кто-то сходил на бекенд, получил оттуда достаточно большой ответ и неспеша забирает его у nginx'а - ограничение будет продолжать срабатывать. Например, если клиент сделал запрос (ответ на который не помещается в буфер сокета), после чего пропал и на пакеты не отвечает - ограничение будет срабатывать, пока не случится send_timeout. -- Maxim Dounin http://nginx.org/ _______________________________________________ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru