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