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

У меня довольно стандартная установка, когда внешний сервер 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).


person avernet    schedule 02.07.2010    source источник


Ответы (1)


Решением является 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 использует один процесс, который, в свою очередь, создает потоки для обработки запросов.
  • В UNIX, если вы используете Apache, поставляемый с вашей ОС, к сожалению, есть большая вероятность, что у вас prefork MPM Apache, который создает один процесс на запрос и с которым параметр max не будет работать:

    1. To check what MPM you have, run apachectl -l.
    2. В списке, если вы видите worker.c или event.c, то вы почти молодец: теперь вам просто нужно убедиться, что Apache создает только один процесс. Для этого установите ThreadsPerChild и MaxClients на одно и то же значение, которое будет общим количеством одновременных подключений, которые сможет обработать ваш Apache. Также установите ServerLimit на 1.
    3. В списке, если вы видите prefork.c, то вам сначала нужно заменить свой Apache на worker или event MPM Apache. Вы можете сделать это, перекомпилировав Apache самостоятельно (MPM не является параметром конфигурации во время выполнения) или получив существующий пакет для вашей платформы. Затем перейдите ко второму шагу.
person erloewe    schedule 06.02.2011
comment
@Alessandro Alessandro - У вас там довольно сильное редактирование ... Вы думали о добавлении еще одного ответа? Совершенно нормально ответить на свой вопрос! - person Kobi; 08.02.2011
comment
@Alessandro, вы можете ограничить количество процессов одним и позволить ему использовать больше потоков. Там нет реальной проблемы (с более современными операционными системами ... такой подход вызвал бы серьезные проблемы 10+ лет назад), хотя это необычно и может вызвать некоторое нытье со стороны пуритан. Ух. Ага. Хорошая редакция! Я тоже согласен с Коби. :) - person erloewe; 08.02.2011