worker_connections

Maxim Dounin mdounin на mdounin.ru
Пн Янв 4 17:57:55 UTC 2021


Hello!

On Mon, Jan 04, 2021 at 04:59:53PM +0200, Gena Makhomed wrote:

> В документации написано, что значение по-умолчанию
> для директивы worker_connections равно 512.
> 
> Значение директивы worker_connections равное 512
> дает всего лишь 256 одновременных подключений к бекенду.
> 
> И там же в документации нарисован пример,
> увеличивающий worker_connections до 2048.
> 
> Не совсем понятно, чем вызвано такое маленькое значение
> для директивы worker_connections указано по-умолчанию.
> 
> worker_connections 512 - это явно не оптимальное значение.
> 
> Ведь даже в дефолтовом конфиге nginx.conf, который поставляется
> с nginx указано в два раза большее значение: worker_connections 1024;

На некоторых операционных системах 1024 уже упирается в 
ограничение ОС, поэтому по умолчанию используется 512.

При этом даже минимальное значение по умолчанию - в разы больше, 
чем MaxClients (MaxRequestWorkers) в каком-нибудь Apache, так что 
нет повода считать, что оно слишком маленькое.

Скорее, тут вопрос в том, что сам nginx позволяет существенно 
больше.  Но это уже отдельный вопрос, который в первую очередь 
упирается в грамотную настройку операционной системы.

> Каким способом можно подобрать наиболее оптимальное значение
> для директивы worker_connections - так чтобы nginx не упирался
> в этот лимит даже в случае DDoS-атак на сервер и в то же время,
> чтобы память зря не расходовалась?

В первую очередь стоит отталкиваться от того, какое максимальное 
количество соединений может держать операционная система с 
конкретными настройками.  И настраивать nginx так, чтобы он таки 
_упирался_ в worker_connections чуть раньше, чем операционная 
система упрётся в свои ограничения (или nginx упрётся в 
ограничения операционной системы).  Потому что:

1. Если первой упрётся операционная система - то может статься, 
что операционную систему мы потеряем.

2. А если nginx упрётся в какой-нибудь лимит по max files - то он 
не сможет принимать входящие соединения вообще, и даже их сразу 
закрывать после этого, и в то же время accept() будет всегда 
сообщать о новых соединениях.  Как-то игнорировать такое, 
периодически ругаясь в логи, nginx с некоторых пор умеет, но это 
категорически неправильный режим работы.

3. При приближении к исчерпанию worker_connections nginx умеет 
закрывать keepalive-соединения, которые дольше всего не 
использовались, тем самым снижая нагрузку.

-- 
Maxim Dounin
http://mdounin.ru/


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