Как получить httpd для пересылки нескольким tomcats для разных URL, включая /? - PullRequest
1 голос
/ 11 марта 2011

ОК

Итак, у меня настроено несколько экземпляров tomcat на нескольких AJP-портах, у меня также есть Apache httpd, прослушивающий порт 8090 (потому что у меня уже есть другое приложение, использующее 8080 на данный момент).

Я успешно сопоставил URL-адреса, такие как mydomain.com:8090/demo и mydomain.com:8090/preprod, с соответствующими экземплярами tomcat, используя Jk Mount и следующую конфигурацию vhosts;

<VirtualHost *:8090>
    JkMount /preprod* preprod
    JkMount /demo* demo
</VirtualHost>

Но я также хочу, чтобы "корневой" адрес отображался на другой экземпляр tomcat, который станет live / production, т.е. я хочу, чтобы mydomain.com:8090/ отображал третий экземпляр tomcat.

На данный момент ничегопроизойдет или изменится, если я просто добавлю в вышеупомянутый конфиг строку:

JkMount /* rootwar

, если захожу на mydomain.com:8090 Я просто получаю ту же скучную целевую страницу apache httpd, сообщающую мне о ее работе (т.е. индекс.html в httpd / htdocs)

Можно ли использовать JkMount для перенаправления «корневого» адреса в экземпляр tomcat?

Я вижу, что правило, подобное / *, также будет соответствоватьURL, такие как mydomain.com/preprod, но я надеялся, что правила будут применены по порядку, так что если / * появится в конце, это будет "если это не одна из других сред, то направьте в root / production"

Просто чтобы прояснить, я пытаюсь настроить следующее:

mydomain.com:8090/preprod --> myApp running in tomcat1
mydomain.com:8090/demo    --> myApp running in tomcat2
mydomain.com:8090         --> myApp running in tomcat3

Ответы [ 3 ]

1 голос
/ 16 марта 2011

Хорошо, так получается, что я был прав насчет провала поведения JkMount, таким образом, конфиг вроде:

<VirtualHost *:8090>
    JkMount /preprod* preprod
    JkMount /demo* demo
    JKMount /* root
</VirtualHost>

прекрасно работает, URL с / preprod в них попали в tomcat1, / demo идет в tomcat2, а все остальное идет в tomcat3 для root. Таким образом, корневая строка JkMount / *, очевидно, является последним пробованным правилом и «перехватывает все» (потому что это / *), если ни одно из других правил не соответствует URL.

Отлично.

0 голосов
/ 13 марта 2011

ОК - не прямой ответ на ваш вопрос, но ... альтернативой может быть запуск каждого из demo / preprod и prop в отдельных случаях, каждый на разных портах.

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

Jetty также очень хорош для таких ситуаций, особенно для запуска быстрых и грязных примеров и демонстрационных экземпляров .... Вы можете написать очень простой скрипт, который в основном просто указывает на развертывание и запускает экземпляр Jetty на некоторых порт:

public static void run(int port, String resourceBase, String descriptor) {
    Server server = new Server(port);

    WebAppContext context = new WebAppContext();
    context.setResourceBase(resourceBase);
    context.setDescriptor(descriptor);
    context.setContextPath("/");
    context.setParentLoaderPriority(true);
    server.setHandler(context);

    try {
        server.start();
        server.join();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

где

  • resourceBase is / path / to / webapp
  • дескриптор обычно это resourceBase + "/ WEB-INF / web.xml"
0 голосов
/ 11 марта 2011

Я давно не работал с jk, но, насколько я помню, это невозможно.Обычно мы работали над этим, добавляя небольшую html-страницу, которая перенаправляла на / root jk mount.Может быть, использование правила mod_rewrite также может сработать.

Примерно так:

RewriteEngine on
RewriteRule ^/?(.+)$ /root/$1 

Также возможно скрыть перенаправление с более сложными правилами перезаписи, пример можно найти здесь:

http://www.webmasterworld.com/apache/4277304.htm

...