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