Nginx разделяет память с помощью limit_req_zone - PullRequest
0 голосов
/ 26 июня 2018

Так что на самом деле я использую nginx для обратного прокси (и балансировки нагрузки) некоторых серверных API-интерфейсов с помощью nginx, и я использую директиву limit_req_zone для ограничения максимального количества запросов на IP и URI.Никаких проблем с этим.

В конце концов нам может понадобиться уменьшить масштаб и добавить еще пару экземпляров nginx.Каждый экземпляр nginx использует «зону разделяемой памяти» для временного сохранения (в кеше, я полагаю) каждого запроса, чтобы он мог надлежащим образом проверить, проходит запрос или нет соответственно с limit_req_zone, упомянутым выше.При этом, как nginx справляется с этим, если одновременно запущено несколько nginx?

Например:

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

Это говорит nginx о разрешении только 1 запросав секунду с того же IP-адреса, но что если второй запрос (в течение той же секунды) поступит к другому экземпляру nginx?Как я понимаю, это пройдет, потому что они не разделяют общую память, где хранится кеш, я думаю.

Я пытался немного изучить это, но ничего не смог найти.Любая помощь будет признательна.

1 Ответ

0 голосов
/ 21 декабря 2018

Если под несколькими nginx вы подразумеваете несколько основных процессов, я не совсем уверен, каков будет результат.Чтобы запустить несколько главных процессов, им необходимо иметь разные конфиги / разные порты для привязки.

Для рабочих процессов с одним главным экземпляром общая память - это именно то, что разделяется, и все рабочие будутограничить запросы вместе.В документации кода написано:

shared_memory - список зон совместно используемой памяти, каждая из которых добавляется путем вызова функции ngx_shared_memory_add ().Общие зоны отображаются на один и тот же диапазон адресов во всех процессах nginx и используются для совместного использования общих данных, например дерева кэша HTTP в памяти.

http://nginx.org/en/docs/dev/development_guide.html#cycle

InКроме того, есть запись в блоге о limit_req, в которой говорится следующее:

Зона - Определяет зону общей памяти, используемую для хранения состояния каждого IP-адреса, и частоту обращения к URL-адресу, ограниченному запросом.Хранение информации в общей памяти означает, что она может быть разделена между рабочими процессами NGINX.Определение состоит из двух частей: имя зоны, определяемое ключевым словом zone =, и размер после двоеточия.Информация о состоянии около 16 000 IP-адресов занимает 1 мегабайт, поэтому наша зона может хранить около 160 000 адресов.

Взято из https://www.nginx.com/blog/rate-limiting-nginx/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...