Nginx proxy_pass, ограничение активных одновременных подключений

У меня есть служба, работающая на машине низкого уровня (за Nginx), и производительность процессора довольно низкая. Один из API требует много процессорного времени, поэтому необходимо ограничить максимальное количество одновременных запросов. Но если запрос кэширован, он может ответить намного быстрее.

Я хочу ограничить максимальное количество одновременных подключений, отправляемых серверной службе для определенного API. Я исследовал limit_req и limit_conn, но ни один из них не подходит для моего случая. limit_req может вызвать высокую нагрузку (слишком много пропусков) или низкую нагрузку (когда большинство запросов кэшируется), значение определить непросто. Пока limit_conn отбросит остальные запросы (я хочу, чтобы они были поставлены в очередь).

В настоящее время я использую модуль apache2 mpm, но он ограничивает все запросы.

Можно ли заставить Nginx поддерживать максимальное количество подключений и заставлять остальных ждать?


person newnius    schedule 13.12.2019    source источник


Ответы (1)


На основе Nginx Cache

Если многие запросы пытаются получить доступ к одним и тем же данным, вы можете использовать механизм блокировки, чтобы, по крайней мере, предотвратить перегрузку сервера, когда он действительно бесполезен.

proxy_cache_lock on

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

На основе запросов Apache2

В Apache вы можете указать максимальное количество клиентских подключений, которые можно сделать сразу. Устанавливая это значение на очень маленькое число, включая 1, он автоматически ставит в очередь дополнительные запросы.

MaxRequestWorkers 1

(В старых версиях до 2.3.13 используйте MaxClients)

Это конфигурация сервера, поэтому все соединения будут затронуты. Поэтому важно, чтобы вы запускали отдельный экземпляр для этой конкретной службы и маршрутизировали весь доступ через этот конкретный сервер Apache2.

          O  Internet
          |
          v
+-------------------+
|                   |   proxy based on URL or such
|  Main HTTP Server +---------------+
|                   |               |
+---------+---------+               |
          |                         v
          |               +-----------------------------------+
          v               |                                   |
+-------------------+     |  Apache with MaxRequestWorkers=1  |
|                   |     |                                   |
|  Main Services    |     +---------+-------------------------+
|                   |               |
+-------------------+               |
                                    v
                        +--------------------------+
                        |                          |
                        |  Slow Service Here       |
                        |                          |
                        +--------------------------+
person Alexis Wilke    schedule 21.02.2020
comment
Спасибо за ваше редактирование. Похоже, что proxy_cache не предназначен для этой цели и не может реализовать требования. Он ограничивает один запрос исходным сервером, но другие будут получать тот же результат. - person newnius; 23.02.2020
comment
@Newnius Ах да. Извините, я подумал, что вы спрашиваете о доступе, который будет сохранен в кеше. Если бы не кешировать, то это действительно не помогло бы. Боюсь, у меня нет ответа. Я думаю, что большинство технологий будет использоваться для распределения ваших запросов по нескольким бэкэндам вместо того, чтобы задерживать их. - person Alexis Wilke; 25.02.2020
comment
Да, я знаю, что моя ситуация ненормальная. Правда в том, что производительность моего NAS очень низкая, поэтому мне нужен maxconn при рендеринге эскизов, иначе сервер остановится на несколько минут. - person newnius; 25.02.2020
comment
@Newnius Хорошо. Понятно (хотя я не тестировал ...) Я думаю, вы можете добавить прокси, который обращается к другому HTTP-серверу, где вы ограничиваете количество рабочих. Я не знаю насчет Nginx, но я предполагаю, что у него есть подобное ограничение. Я покажу, как настроить Apache, чтобы ограничить количество подключений до 1. Надеюсь, это сработает для вас! - person Alexis Wilke; 26.02.2020