Apache: как настроить в Apache / mod_proxy верхнюю границу для количества одновременных перенаправленных запросов? - PullRequest
1 голос
/ 02 июля 2010

У меня довольно стандартная установка, когда интерфейсный сервер Apache пересылает запросы в Tomcat через mod_proxy / AJP. Как я могу настроить Apache / mod_proxy, чтобы он только перенаправлял не более N (скажем, N = 4) одновременных запросов в Tomcat? Другие параллельные запросы, поступающие в Apache, не следует отклонять, а вместо этого следует ставить в очередь для последующей отправки в Tomcat.

PS 1: обратите внимание, что это то, что вы можете сделать на уровне Tomcat с атрибутом maxThreads, но я предпочитаю обрабатывать это на уровне Apache.

PS 2: Я вижу, что Apache имеет конфигурацию MaxClients , которая, кажется, выполняет то, что я ищу. Но мне не ясно, как получить MaxClient для каждого сервера mod_proxy, а не MaxClient для Apache. То есть если Apache перенаправляет запросы в кластер из 4 компьютеров Tomcat, я бы хотел, чтобы Apache ограничил число одновременных запросов, пересылаемых любому данному Tomcat, до N (скажем, N = 4).

1 Ответ

1 голос
/ 06 февраля 2011

Решением является mod_proxy путем добавления параметров в директивы ProxyPass .То, что вы хотите установить, это, вероятно, max .Однако это немедленно выдаст ошибку и не поставит в очередь ваши запросы, когда вы нажмете max .

Если вы действительно хотите поставить в очередь, вы должны использовать также mod_proxy_balancer.Например, разрешите максимум 4 соединения:

ProxyPass / balancer://appservers/ stickysession=JSESSIONID|jsessionid nofailover=On
<Proxy balancer://appservers>
    BalancerMember ajp://192.168.0.100:8009 max=4
    BalancerMember ajp://192.168.0.101:8009 max=4
    BalancerMember ajp://192.168.0.102:8009 max=4
    BalancerMember ajp://192.168.0.103:8009 max=4
</Proxy> 

К сожалению, в Apache значение max относится к процессу.Таким образом, вы можете эффективно ограничить количество подключений к вашим внутренним серверам только в том случае, если Apache имеет один процесс и использует потоки вместо процессов для обработки нескольких подключений, что зависит от того, что MPM используется Apache:

  • В Windows у вас должно быть все хорошо, и, скорее всего, вам не нужно об этом беспокоиться, поскольку winnt MPM использует один процесс, который вturn создает потоки для обработки запросов.
  • В UNIX , если вы используете Apache, поставляемый с вашей ОС, к сожалению, есть хороший шанс, что у вас есть preforkMPM Apache, который создает один процесс на запрос и с которым параметр max не будет работать:

    1. Чтобы проверить, какой у вас MPM, запустите apachectl -l.
    2. В списке, если вы видите worker.c или event.c, то вы почти хороши: теперь вам просто нужно убедиться, что Apache создает только один процесс.Для этого установите ThreadsPerChild и MaxClients на одно и то же значение, которое будет общим числом одновременных соединений, которые ваш Apache сможет обработать.Также установите ServerLimit в 1.
    3. В списке, если вы видите prefork.c, вам сначала нужно заменить Apache на рабочий или событийный MPM Apache.Вы можете сделать это, либо перекомпилировав Apache самостоятельно (MPM не является параметром конфигурации времени выполнения), либо получив существующий пакет для вашей платформы.Затем перейдите ко второму шагу.
...