Apache — два виртуальных хоста для разных рабочих

У меня есть приложение, работающее на 4 внутренних серверах JBoss. Эти серверы находятся за веб-сервером Apache. В настоящее время я вызываю свое приложение с помощью my.app1.com (просто пример), и запрос отправляется на один из внутренних серверов.

Что я хотел бы сделать, так это вызвать мое приложение с другим доменом, например my.app2.com. И вот сложная часть того, чего я пытаюсь достичь: когда я вызываю приложение с помощью my.app1.com, я хочу, чтобы запрос направлялся на два первых внутренних сервера (или обслуживался двумя из workers), и когда я вызываю его с помощью my.app2.com, я хочу, чтобы запрос направлялся на два других внутренних сервера (или обслуживался двумя другими worker).

Я подумал, что смогу добиться этого, создав два разных раздела VirtualHost, в каждом из которых я буду вызывать разные файлы work.properties, используя свойство JkWorkersFile path/to/workers.properties внутри VirtualHost. Но после перезагрузки конфигурации я обнаружил, что JkWorkersFile нельзя использовать внутри VirtualHost. И привести пример того, что я сделал:

Мои разделы VirtualHost выглядят так:

<VirtualHost *:80>                                                                 
    ServerName my.app1.com
    <....Other configuration here....>
    JkWorkersFile path/to/workers1.properties
</VirtualHost>

<VirtualHost *:80>                                                                 
    ServerName my.app2.com
    <....Other configuration here....>
    JkWorkersFile path/to/workers2.properties
</VirtualHost>

Мой файл work1.properties выглядит так:

worker.instance1.reference=worker.template
worker.instance1.host=localhost 
worker.instance1=10109 
worker.instance1.domain=group1

worker.instance2.reference=worker.template
worker.instance2.host=localhost 
worker.instance2=10109 
worker.instance2.domain=group1

Мой файл worker2.properties выглядит так:

 worker.instance3.reference=worker.template
    worker.instance3.host=localhost 
    worker.instance3=10109 
    worker.instance3.domain=group2

    worker.instance4.reference=worker.template
    worker.instance4.host=localhost 
    worker.instance4=10109 
    worker.instance4.domain=group2

Но как я писал выше, использование JkWorkersFile внутри VirtualHost не работает.

Я читал на некоторых других форумах, что можно использовать JkMount (поскольку его можно использовать много раз) и указать ему в качестве параметра/значения имя рабочего. Но и это, похоже, не сработало.

Любые предложения о том, как я могу добиться того, что я пытаюсь сделать?


person Pier    schedule 04.10.2015    source источник


Ответы (1)


Я понял, как это сделать. Публикация ответа здесь на случай, если кто-то столкнется с тем же запросом.

Что было необходимо, так это создать второго рабочего балансировщика нагрузки и назначить ему нужные серверные экземпляры. В work.properties (нет необходимости в нескольких файлах worker.properties) среди других конфигураций у меня есть следующее для двух рабочих балансировщиков нагрузки (обратите внимание, это разные вещи для балансировщика нагрузки и разные вещи для внутреннего работника, Я пришел к выводу):

worker.list=loadbalancer1,loadbalance2,status

(для ниже 4 зависит от вас, какие методы вы хотите использовать)

worker.loadbalancer1.method=B
worker.loadbalancer1.lock=P
worker.loadbalancer2.method=B
worker.loadbalancer2.lock=P

.....here goes the list of back-end workers as stated above....

И вот первая важная часть:

worker.loadbalancer1.type=lb
worker.loadbalancer1.balance_workers=LIST1_OF_BACKEND_WORKERS_YOU_WANT_TO_ASSIGN
worker.loadbalancer1.sticky_session=True
worker.loadbalancer1.retries=1

worker.loadbalancer2.type=lb
worker.loadbalancer2.balance_workers=LIST2_OF_BACKEND_WORKERS_YOU_WANT_TO_ASSIGN
worker.loadbalancer2.sticky_session=True
worker.loadbalancer2.retries=1

worker.status.type=status

Затем в conf.d у меня есть файл с именем uriworkermap.properties, где у меня есть следующее, которое сообщает каждому из двух рабочих процессов балансировщика нагрузки отправлять запросы на серверную часть (то есть на назначенные им экземпляры):

/*=loadbalancer1;
/*=loadbalancer2;

Затем я настроил два виртуальных хоста, каждый из которых прослушивает разные доменные имена (как показано выше):

<VirtualHost *:80>                                                                 
    ServerName my.app1.com
    <....Other configuration here....>
    JkMount /* loadbalancer1
</VirtualHost>

<VirtualHost *:80>                                                                 
    ServerName my.app2.com
    <....Other configuration here....>
    JkMount /* loadbalancer2
</VirtualHost>

Проще говоря, строка JkMount /* loadbalancer{N} указывает каждому виртуальному хосту отправлять все запросы указанному балансировщику нагрузки, который, в свою очередь, перенаправляет запрос назначенным ему внутренним исполнителям.

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

person Pier    schedule 14.10.2015
comment
Это хороший ответ на хороший вопрос. Вы должны нажать кнопку «Принять» (галочка), чтобы пометить его как ответ. - person vallismortis; 01.07.2019